SQL SERVER 书签查找

当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求。对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup)。这种查找即是——书签查找。

书签查找根据索引的行定位器从表中读取数据。故此,除了索引页面的逻辑读取外,还需要数据页面的逻辑读取。如果查询的结果是大数据集,建议使用聚簇索引。聚簇索引不用书签查找,因为叶子页面和数据页相同。

看下面的实例(AdventureWorks):

    
    
select * from Sales.SalesOrderDetail as sod where sod.ProductID = 776

列ProductID是表上的非聚簇索引,

    
    
CREATE NONCLUSTERED INDEX [ IX_SalesOrderDetail_ProductID ] ON [ Sales ] . [ SalesOrderDetail ] ( [ ProductID ] ASC )

非聚簇索IX_SalesOrderDetail_ProductID包含列ProductID以及组成聚簇索引的

列SalesOrderId,SalesOrderDetailId(SalesOrderId,SalesOrderDetailId是表上的复合主键,

因为非聚簇索引的叶子节点是聚簇索引),并没有覆盖查询的所有列,故此需要一个书签查找。

SQL SERVER 书签查找 - vituk - vituk

ProductID=776查询结果是228行,但是随着结果集的增大,需要书签查找的非聚簇索引将会被优化器放弃而采用聚簇索引扫描,如:

    
    
select * from Sales.SalesOrderDetail as sod where sod.ProductID = 793

此查询结果集是705行,

SQL SERVER 书签查找 - vituk - vituk

表'SalesOrderDetail'。扫描计数1,逻辑读取1240 次

但是如果在表上强制采取非聚簇索引:

SQL SERVER 书签查找 - vituk - vituk

表'SalesOrderDetail'。扫描计数1,逻辑读取2173 次

下面再看一具体实例,来揭示书签查找成因以及避免方法。

    
    
select e.NationalIDNumber,e.Title,e.HireDate from HumanResources.Employee as e where e.NationalIDNumber = ' 693168613 '

HumanResources.Employee表有一非聚簇索引:AK_Employee_NationalIDNumber([NationalIDNumber] ASC),执行后的计划:

SQL SERVER 书签查找 - vituk - vituk

为了避免这个书签查找,应该把查询中引用的字段Title和HireDate添加到非聚簇索引中,

    
    
create unique nonclustered index ak_employee_Nationalidnumber on HumanResources.Employee ( NationalIDNumber asc ,Title asc ,HireDate asc ) with drop_existing

执行查询后的执行计划:

SQL SERVER 书签查找 - vituk - vituk

另一避免书签查找的方法是用覆盖索引,

    
    
create unique nonclustered index ak_employee_Nationalidnumber on HumanResources.Employee ( NationalIDNumber asc )include(title,hiredate) with drop_existing

执行计划图:

SQL SERVER 书签查找 - vituk - vituk

注意:由于文件大小为100MB,但本人的上传权限只有60MB,所以分开两部分压缩上传。解压前必须与part2一起解压。part2在本人的资源里可以找到:http://download.csdn.net/user/lxm0918 本书通过大量实例,详细介绍了SQL Server数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。   本书适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读本书,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。 第1章 SQL查询性能调整   第2章 系统性能分析   第3章 SQL查询性能分析   第4章 索引分析   第5章 数据库引擎调整顾问   第6章 书签查找分析   第7章 统计分析   第8章 碎片分析   第9章 执行计划缓冲分析   第10章 存储过程重编译   第11章 查询设计分析   第12章 阻塞分析   第13章 死锁分析   第14章 游标开销分析   第15章 数据库工作负载优化   第16章 SQL Server优化检查列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值