继续重新索引sql表

时间:2013-07-09 13:08:51

标签: 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)[姓名,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(bit,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,not null)
  • fkPRID(FK,int,null)
  • fkNID(int,null)

索引:

  • I_AG(非唯一,非群集)[fkAGID]
  • I_IM(非唯一,非群集)[fkIMID]
  • I_R(非唯一,非群集)[fkPRID]
  • PK_D(Clustered)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)
  • Size(int,null)
  • FMB(nvarchar(50),null)

索引:

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

3 个答案:

答案 0 :(得分:5)

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

pk_Name (Clustered) [Name, fkID]

群集密钥确定数据库表中记录的物理顺序。如果Name是一个字符串并且值以“随机”顺序插入(即并不总是按字母顺序排在表的末尾),则可能存在性能问题,因为数据库总是必须将“插入”行到物理表中。这可能会导致表数据碎片化,这也可能会降低性能。

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

此外,您的定义未指定构成表2和表3上的聚簇索引的列,但基于我假设它们被ID编入索引的名称。

答案 1 :(得分:2)

Ola Hallengren的索引和统计维护工具/脚本是一个很好的工具,可以分析并在必要时重建索引和更新统计信息。我们每晚运行这个东西,以及完整性检查,以保持我们的数据库健康。

http://ola.hallengren.com/

答案 2 :(得分:1)

我遇到了类似的问题。 向表中添加数据时,只有在您通过特定更改阈值时才会更新统计信息,如下所述:

http://blog.sqlauthority.com/2010/04/21/sql-server-when-are-statistics-updated-what-triggers-statistics-to-update/

除了我们使用数据库的方式发生重大变化外,我还没有找到任何解决此问题的好方法。 同时你可以运行

UPDATE STATISTICS <Table Name>

alter INDEX <Index Name> ON <Table Name> rebuild

每晚