设计SQL Server非聚簇索引优化查询(下)

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

我们应该经常问自己这些问题: 改进的查询时间是否抵得过IUD操作增加的I/O和维护开销?我们在查询上获得的任何性能提高是否抵得过额外的I/O和增加的维护时间?哪种方式在尽可能低开销的情况下能为我们提供最准确的结果?在这种情况下,最佳解决方案将是下面三个非聚簇索引: 1. DateFrom  2. DateTo  3. DateInserted 在这种情况下,除了在三个非聚簇索引中都存储的主键,其余每个域都只存储一次。因此,索引大小将非常小,并且所需要的I/O和维护也将更少。SQL Server将根据所选择的查询条件,查询每个非聚簇索引,然后将结果集中在一起。虽然它……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

我们应该经常问自己这些问题:

  • 改进的查询时间是否抵得过IUD操作增加的I/O和维护开销?
  • 我们在查询上获得的任何性能提高是否抵得过额外的I/O和增加的维护时间?
  • 哪种方式在尽可能低开销的情况下能为我们提供最准确的结果?

在这种情况下,最佳解决方案将是下面三个非聚簇索引:

1. DateFrom
  2. DateTo
  3. DateInserted

在这种情况下,除了在三个非聚簇索引中都存储的主键,其余每个域都只存储一次。因此,索引大小将非常小,并且所需要的I/O和维护也将更少。SQL Server将根据所选择的查询条件,查询每个非聚簇索引,然后将结果集中在一起。虽然它不如例1一样高效,但是比起定义五个不同的非聚簇索引,它的效率要高得多。实际查询中,会更多使用例2的结构,而不是例1。

SQL Server统计

统计告诉SQL Server最可能有多少行与一个给定值相匹配。它告诉SQL Server匹配值有多“精确”,这个信息将用以确认是否该使用索引。默认情况下,当SQL Server发现有接近20%的记录发生改变时,它将自动更新统计。在SQL Server 2000中,它是与IUD操作同步进行的,同时在抽取行样本时它会延迟所进行的IUD操作。在SQL Server 2005中,我们可以设置抽样与IUD操作同步,或者与IUD操作异步进行。后一种方法更好并且可以减少阻塞,因为锁会更快地被释放。我推荐关闭数据库设置的“自动更新统计(Auto Update Statistics)”。这个设置将在服务器最忙的时候增加服务器的负荷。取代设置SQL Server自动保持统计更新的方法是,我们可以创建一个任务来调用命令“更新统计”,并使它在服务器最空闲的时候运行。我们可以根据我们所希望的统计精确性来选择自己的取样频率。

统计只在在任何非聚簇索引的第一个字段上进行。而这在复合非聚簇索引中意味着什么呢?它意味着SQL Server将使用第一个域来确认是否应该使用索引。即使复合索引的第二个域匹配50%的记录行,并且该域仍然需要被用来返回结果(如例3)。现在,如果非聚簇索引被分成两个非聚簇索引,那么SQL Server可能选择使用索引1而不是索引2。这是因为在索引2上的统计可能显示它不适合查询(如例4)。

Example 3

假设我们在DateFrom和Amt上定义了一个复合非聚簇索引。

统计将仅会在索引中的DateFrom域中进行,而SQL Server将同时查找(或扫描)DateFrom和Amt。由于SQL Server必须检查更多的数据,因此,查询将比较缓慢。

Example 4

假设我们有两个非聚簇索引:第一个定义在DateFrom上,而第二个定义在Amt上。 

由于它们是不同的索引,因此这两个域都会被统计。SQL Server将检查DateFrom上的统计并决定使用哪个索引。接着,它还将检查Amt字段并可能决定——根据统计——该索引不够精确,应该被忽略。在这种情况下,SQL Server将仅需要检查DateFrom域,而非DateFrom和Amt,这样就可以实现更快的查询。

通过使用SQL Server中的非聚簇索引,我们将可以关注于数据子集中的查询。使用本文中描述的规则来确定是应该创建多非聚簇索引还是复合非聚簇索引。同时,记住统计的作用,以及它们是如何影响非聚簇索引的:在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的能源管理》等。

相关推荐