【问题标题】:Keep having to reindex sql tables必须重新索引 sql 表
【发布时间】:2013-07-09 13:08:50
【问题描述】:

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

表1

  • ID(整数,非空)
  • 类型(tinyint,非空)
  • 名称(PK,nvarchar(255),不为空)
  • fkID(PK,int,非空)
  • UID(整数,非空)

索引:

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

表2

  • ID(PK、bigint,非空)
  • 名称(nvarchar(50),非空)
  • ShortValue (nvarchar(250), null)
  • StringValue (nvarchar(max), null)
  • IntValue (int, null)
  • FloatValue (float, null)
  • DateTimeValue(日期时间,空)
  • BoolValue(位,空)
  • 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,非空)
  • fkPRID (FK, int, null)
  • fkNID (int, null)

索引:

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

Table3

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

索引:

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

【问题讨论】:

  • 为什么主键是name而不是ID?
  • 恢复了以前的编辑 - 更改的标题具有误导性,格式也没有好多少。
  • 好问题@BobVale,我真的不认为有充分的理由,所以我可能应该改变它。同样基于以下 D Stanley 的回复。

标签: sql sql-server


【解决方案1】:

让我印象深刻的一栏是这一栏:

pk_Name (Clustered) [Name, fkID]

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

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

此外,您的定义没有指定构成表 2 和 3 上的聚集索引的列,但根据我假设它们由 ID 索引的名称。

【讨论】:

  • 谢谢,这确实有道理。我会试一试,看看效果如何。不过可能需要一段时间才能确定效果。主键仅在其他两个表的 ID 上。
  • 没有注意到这样做有很大的不同,我认为问题出在其他地方,所以我会继续寻找。但是有一个问题,在多个非聚集索引中包含一列是否会造成性能问题?
【解决方案2】:

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

http://ola.hallengren.com/

【讨论】:

  • 这确实起到了很大的帮助,但有时我们必须比每晚更多地按需运行它......现在感觉就像是一个创可贴,所以我得再研究一下.
【解决方案3】:

我遇到了类似的问题。 当您将数据添加到表中时,仅当您通过此处所述的特定更改阈值时才会更新统计信息:

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

每晚

【讨论】:

  • 谢谢,我会检查那篇博文。是的,我们正在为这些表运行索引重建作业,但我们必须每天执行几次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2015-05-23
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多