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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server管理器是用于管理SQL Server数据库服务器的工具。它提供了一个用户友好的界面,允许管理员执行各种管理任务,包括创建数据库、备份和还原数据库、创建和管理登录账户以及监视数据库服务器的性能等。 SQL Server管理器中的书签功能可以方便地访问经常使用的数据库、服务器和其他对象。通过创建书签,管理员可以快速导航到经常访问的目标,而无需浏览整个对象树。 要使用书签功能,首先打开SQL Server管理器。然后在对象资源管理器窗格中,右键点击要添加为书签的对象,如数据库、服务器或其他对象。在弹出的菜单中选择“添加到书签”选项。此时会出现一个对话框,要求输入书签的名称和描述。在输入完毕后,点击“添加”按钮即可将该对象添加为一个书签。 一旦添加了书签,可以在“书签”节点下找到它们。单击书签即可打开相应的对象。管理员还可以在“书签”节点上右键点击,选择“重命名”或“删除”来对书签进行管理。 使用书签功能可以大大提高管理员的工作效率。如果经常需要访问某个数据库或服务器,可以将其添加为书签,以便快速导航到目标对象。此外,书签功能还可以帮助管理员组织和管理大量的数据库和服务器对象,使其更易于查找和访问。 总的来说,SQL Server管理器的书签功能是一个方便的工具,可以帮助管理员快速导航到经常访问的数据库、服务器和其他对象,提高工作效率和管理效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值