`
java-mans
  • 浏览: 11456126 次
文章分类
社区版块
存档分类
最新评论

消除Key Lookup和RID Lookup Part2:索引交集和索引Join

 
阅读更多

今天在MSDN查询优化建议中看到这样一条信息:SQL Server 会自动考虑索引交集并可以在同一查询中对同一个表使用多个索引(可能跟大家的理解有偏差)。

在解释之前我们先看一个例子:

useAdventureWorks

go

select soh.*

from sales.SalesOrderHeaderASsoh

WHERE soh.SalesPersonID= 276

and soh.OrderDatebetween'4/1/2002'and'7/1/2002'

查看执行计划:

虽然我们建立了SalesPersonID的非聚集索引,但是SQL Server并没有使用,因为OrderDate并没有包含在索引中。 相信这时候大部分的人会在索引上面加一列OrderDate.其实可以还可以有另外一种方法,不改变现在的索引,而新添加一个新索引。 这样SQL Server可以使用多个索引来完成本次查询,这个过程就是索引交集。

那么我们现在OrderDate上面创建一个索引:

CREATE NONCLUSTEREDINDEX[ix_orderdate]ON [Sales].[SalesOrderHeader]( [OrderDate]ASC)

增加索引后我们会看到下面的执行计划:

这次SQL Server使用了两个Non-clustered index seek,然后获得两个子集的索引交集,最后通过Keylookup获得所有输出字段.而通常我们认为一个对一个表的查询不会用到多个索引。其实SQLServer 优化引擎是可以使用到多个索引的优势。

上面的测试给我们一种启示,有的时候不一定要通过一个宽索引列(多个索引键值)提高性能,也可以通过多个窄索引键提升性能。另外如果你发现索引没有覆盖到所以的查询条件,但是你又不能直接改索引时,添加另外一个索引也可以满足你的要求。

而索引联接是索引交集的一个变种,如果查询能够从索引中直接获得所需要的数据,就会称为Index join(上面我们看到数据还是需要Key Lookup中获取,Index无法提供所有的数据).

更多信息可以参考:

http://msdn.microsoft.com/zh-cn/library/ms188722(v=sql.105).aspx

http://msdn.microsoft.com/zh-cn/library/aa226170(v=sql.70).aspx

分享到:
评论

相关推荐

    解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Key Lookup)

    Bookmark Lookup、RID Lookup、Key Lookup定义 一说到这三者,如果对索引研究不深的童鞋估计是懵逼的,什么玩意,我们姑且将上面三者翻译为:标签查找、行ID查找、键查找。标签查找和键查找是一个意思,在SQL 2005...

    【含源码和addin】RevitLookup 2020

    用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2019下即可。(如果不能正常使用,请用Visual Studio打开源码,将项目所需的引用更新到正确的路径,编译生成RevitLookup.dll...

    解决docker报错dial tcp lookup registry-1.docker.io

    解决docker报错dial tcp lookup registry-1.docker.io

    RevitLookup-2016.0.0.6 已编译 直接使用

    以下是编译过程 和 原始插件下载地址------------------------- 下载 RevitLookup for Revit 2016 https://forums.autodesk.com/t5/revit-api-forum/revitlookup-for-revit-2016-is-here/td-p/5600976 在vs中编译...

    Revit2017 Lookup

    Revit二次开发必备插件,分享给没找到最新RevitLookup插件的童鞋。(PS:需要自己手动将RevitLookUp.dll与插件的addin文件注册到Revit对应的文件夹下。)

    fwknop-client

    fwknop-client

    Revit2019 Lookup【含源码和addin】

    【含源码和addin】Revit 2019 Lookup Tables顾名思义就是Revit表格查找工具,是revit开发必不可少的一个组件,需要的朋友可以下载! 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit...

    pe_lookup:与'puppet lookup'命令类似,但带有分类器

    该模块提供一个Puppet命令puppet pe lookup ,该命令输出在Hiera和/或Classifier中定义的键(类参数)。 设置 在主要主机上安装此模块。 用法 以root身份在Primary Master上运行puppet pe lookup <KEY>命令。 参数 ...

    RevitLookup - 2016

    RevitLookup - 2016 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2016下即可

    RevitLookup - 2017

    RevitLookup - 2017 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2017下即可

    RevitLookup-master.rar

    Revit 2020 Lookup 是Revit查找工具,是Revit开发必不可少的一个组件,需要的朋友可以下载! 用法:将文件解压后找到 RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2020下即可

    RevitLookup-2016.0.0.6

    Revit二次开发必备插件,分享给没找到最新RevitLookup插件的童鞋。(PS:本插件为源码,未编译,需要自己编译且手动将生成的dll与插件的addin文件注册到Revit对应的文件夹下。)

    Vlookup和Lookup函数比较

    在EXCEL表中详细介绍了Vlookup和Lookup函数用法及区别

    RevitLookup-2018.0.0.1

    Revit二次开发必备插件,分享给没找到最新RevitLookup插件的童鞋。(PS:本插件为源码,未编译,需要自己编译且手动将生成的dll与插件的addin文件注册到Revit对应的文件夹下。注意:由于Revit2018的库里加了新方法,...

    RevitLookup-2019.0.0.3.rar

    Revit二次开发必助插件revit lookup,辅助开发人员查看revit内部结构。方便开和学习内部结构

    RevitLookup-2021.0.0.13

    RevitLookup-2021.0.0.13,供各位做REVIT二次开发的同仁们下载、学习、研究。

    DNS-Lookup-Tool-in-Python:DNS 查找脚本

    DNS 查找工具 这个程序的基本过程如下: ... python dnslookup.py "DNS server IP" domainName -> eq: python dnslookup.py 8.8.8.8 将域名: 发送到 DNS 服务器:8.8.8.8 在端口 53 并获取IP 地址与其他信息。

    vc错误查看工具lookup

    vc错误查看工具lookup vc错误查看工具lookup

    JavaScript 圣经第5版-Javascript编程宝典--黄金版 .rar

    Chapter 2: Authoring Challenges Amid the Browser Wars. Chapter 3: Your First JavaScript Script. Part II: JavaScript Tutorial - Summary. Chapter 4: Browser and Document Objects. Chapter 5: Scripts ...

Global site tag (gtag.js) - Google Analytics