如何维护SQL Server索引以实现查询优化(二)

日期: 2009-04-15 作者:Matthew Schroeder翻译:曾少宁 来源:TechTarget中国 英文

聚簇索引维护   静止的或“不断增长的”聚簇索引都必须有100%的填充因数。因为值是不断增长的,因此只有添加到将最后的索引才不会出现碎片。更详细的探讨,可以阅读这一系列的第一部分《设计SQL Server集簇索引以提升性能》。这个索引分类不需要重建,因为它没有碎裂。

  非静止或不断增长的聚簇索引都会在数据页中数据记录移动时出现碎片或页拆分。这一类的索引必须重建以将碎片保持在较低的比例,从而使查询能有效地使用索引。   当重建这些聚簇索引时,我们必须决定填充因数是多少。正常情况是70%到80%,这可以为新进入页面的记录保留20%到30%的可用空间。

最理想的环境配置必须根据记录移动的频率,插入数……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

聚簇索引维护

  静止的或“不断增长的”聚簇索引都必须有100%的填充因数。因为值是不断增长的,因此只有添加到将最后的索引才不会出现碎片。更详细的探讨,可以阅读这一系列的第一部分《设计SQL Server集簇索引以提升性能》。这个索引分类不需要重建,因为它没有碎裂。

  非静止或不断增长的聚簇索引都会在数据页中数据记录移动时出现碎片或页拆分。这一类的索引必须重建以将碎片保持在较低的比例,从而使查询能有效地使用索引。

  当重建这些聚簇索引时,我们必须决定填充因数是多少。正常情况是70%到80%,这可以为新进入页面的记录保留20%到30%的可用空间。最理想的环境配置必须根据记录移动的频率,插入数据数量以及发生索引重建的次数决定。目标是设置足够低的填充因数,使得在下次循环维护时,页中数据可以达到95%而仍不发生拆分,而只有它们达到100%时才会出现页拆分。

  非聚簇索引维护

  非聚簇索引总会在页上出现数据移动。这个问题并不像发生在聚簇索引上一样难解决——在聚簇索引上发生的实际数据记录移动,在非聚簇索引中只是记录指针的移动。换言之,相同的规则将应用在非聚簇索引上,直到设置填充因数。再次,目标是设置足够低的填充因数,这样在下次循环维护时,页中数据就只达到95%。

  非聚簇索引总是会出现碎片,为了避免这个情况,我们必须对它进行不断地监控和维护。

  拆分表索引要考虑的方面

  拆分表可以根据字段中的数据将数据分割到不同的分区中。大多数表是根据日期范围拆分的。比如,将订单表按年分区。假设聚簇索引是对齐的(如本系列的第1部分),那么我们可以重新索引2000年100%填充因数的非聚簇索引,因为从技术上来说,这个数据是不能移动的。在这种情况下,2008年分区的非聚簇索引上的填充因数可能是70%,这样它就是允许移动数据的,但是2000年的分区将不能发生任何移动,而且它可以用100%填充因数进行重新索引,因此可以优化索引查找。

  相同的概念可以应用到非静止或不断增长的聚簇索引上。需要移动数据的聚簇索引在2008年分区上设置70%填充因数而在2000年分区设置100%填充因数。

  SQL Server统计

  统计维护在字段和索引上,并且它们会用于帮助SQL Server确定某些值可能的“唯一”性——比如,如果统计显示某个值可以匹配接近80%的记录行,那么SQL Server将通过扫描表来代替索引。如果统计显示某一个值可能匹配接近10%的行,那么查询优化器将选择影响数据库最小的查询。

  SQL Server统计可以自动地维护或手动运行。由于重新索引会改变统计结果,因此我推荐,在重新索引之后,我们手动运行sp_updatestats或T-SQL UPDATE STATISTICS命令。统计只在任何组合合索引的第一字段上维护,因此无法确定索引的其它字段的“唯一性”。

  总结

  索引维护对于保证查询能够总是受益于索引使用并减少IO/RAM/CPU是至关重要的,同时这也可以减少阻塞。

  在打开选项“show execution plan”时运行查询。如果查询没有使用我们的索引,那么要进行以下的检查:

  1、运行dbcc showcontig('tablename')来检查表是否有碎片。

  2、检查“where clause”来查看是否它引用了索引的第一个字段。

  3、保证“where clause”的查询条件中没有针对索引的第一个字段的方法。

  4、只当统计过期时才更新统计。如果表有碎片,那么在重新索引之后更新统计。

  5、确保所使用的查询条件是足够唯一的,这样SQL Server更好地查找数据。

作者

Matthew Schroeder
Matthew Schroeder

Matt在SQL Server和Oracle这两个领域具有12年的经验。他获得微软MCITP认证、是一名数据库开发人员,他还获得了计算机科学专业硕士学位是SQL Server数据库系统高级软件工程师,范围从2 GB到3+ TB、2k和40+ktrans/sec之间。目前他任职于IGT公司,同样是一名独立的咨询师、专攻覆盖自动化、电子商务、娱乐和银行业的SQL Server、Oracle以及.NET方面。Matt擅长OLTP/OLAP数据库管理系统以及用.NET语言写可升级的处理系统。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐