继续重新索引sql表

Juh*_*gas 0 sql sql-server

我在SQL Server 2012上有一个数据库,并且我遇到一些问题,一些表在一段时间后变得很慢,而且有助于重建索引.我想知道是否有人对其中任何一个可能出错的人提出建议,我将在下面发布他们的结构和索引.我自己没有构建这个结构,但可以完全修改.

表格1

  • ID(int,not null)
  • 输入(tinyint,not null)
  • 名称(PK,nvarchar(255),非null)
  • fkID(PK,int,not null)
  • UID(int,not null)

索引:

  • I_UID(唯一,非群集)[UID]
  • I_Name(非唯一,非群集)[类型,名称]
  • pk_Name(Clustered)[Name,fkID]

表2

  • ID(PK,bigint,not null)
  • 名称(nvarchar(50),非null)
  • ShortValue(nvarchar(250),null)
  • StringValue(nvarchar(max),null)
  • IntValue(int,null)
  • FloatValue(float,null)
  • DateTimeValue(datetime,null)
  • BoolValue(位,null)
  • fkPID(FK,int,null)
  • fkAID(FK,int,null)
  • fkAGID(FK,int,null)
  • fkVID(FK,int,null)
  • fkCID(FK,int,null)
  • fkL(FK,int,not null)
  • fkIMID(FK,非null)
  • fkPRID(FK,int,null)
  • fkNID(int,null)

索引:

  • I_AG(非唯一,非群集)[fkAGID]
  • I_IM(非唯一,非群集)[fkIMID]
  • I_R(非唯一,非群集)[fkPRID]
  • PK_D(聚集)5447370
  • I_PDL(非唯一,非群集)[fkL]

表3

  • ID(PK,int,not null)
  • fkPID(FK,int,not null)
  • fkAID(FK,int,not null)
  • 排序(int,not null)
  • 组(nvarchar(50),null)
  • 大小(int,null)
  • FMB(nvarchar(50),null)

索引:

  • PK_D(聚集)5447370
  • I_PAA(非唯一,非群集)[fkAID]
  • I_PAP(非唯一,非群集)[fkPID]
  • I_PAPID(非唯一,非群集)[fkPID,fkAID]

D S*_*ley 5

向我说的一栏就是这一栏:

pk_Name (Clustered) [Name, fkID]
Run Code Online (Sandbox Code Playgroud)

聚簇键确定数据库表中记录的物理顺序.如果Name是字符串并且值以"随机"顺序插入(即并不总是按字母顺序排在表的末尾),则可能存在性能问题,因为数据库始终必须将行"插入"到物理表中.这可能导致表数据碎片化,这也可能降低性能.

重新构建聚簇索引还会重新组织物理数据,这可能是您之后看到性能提升的原因.重新计算统计信息也可能是一个因素,但导致非连续插入的主键通常是一个红旗.

您的定义也没有指定构成表2和表3上的聚簇索引的列,但是基于我假设它们被索引的名称ID.