SQL SERVER书签查找的介绍
来源:互联网 发布:mac 公众号 软件 编辑:程序博客网 时间:2024/06/09 19:55
一、SQL SERVER书签查找定义
当查询优化器使用非聚集索引进行查找时,如果所选择的列或查询条件中的列只部分包含在使用的非聚集索引和聚集索引中时,就需要一个查找(lookup)来检索其他字段来满足请求。对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup),这种查找即是——书签查找(bookmark lookup)。
简单的说就是当你使用的sql查询条件和select返回的列没有完全包含在索引列中时就会发生书签查找。
2、如果需要增加逻辑读操作或者开销较大的物理读操作使书签查找的数据检索操作开销相当大,这个开销因素是非聚集索引更适合于返回较小的数据行数的原因。随着查询检索的行数增加,书签查找的开销将变得无法接受。
3、返回大的结果集将增加书签查找的开销,甚至低于表扫描。因此在返回较大结果集的情况下,必须考虑避免书签查找的可能性。
三、避免书签查找的方法
1、使用聚集索引
对于聚集索引,索引的叶子页面和表的数据页面相同。因此,当读取聚集索引键列的值时,数据引擎可以读取其他列的值而不需要任何导航。例如前面的区间数据查询的操作,SQL Server通过B树结构进行查找是非常快速的。
把非聚集索引转换为一个聚集索引说起来很简单。但是,这个例子和大部分可能遇到的情况下,这不可能做到,因为表已经有了一个聚集索引。这个表的聚集索引恰好是主键。必须卸载掉所有的外键约束,卸载并且重建为一个非聚集索引。这不仅要考虑所涉及的工作,还可能严重地影响依赖于现有聚集索引的其他查询。
2、使用覆盖索引
例如
select id,name from persontenthousand where id <100
我们可以在 id,name上面建个组合索引,这样,由于非聚集索引上已经有了需要查询的Id和Name列的数据,所以不在需要书签查找定位到基本表。
3、使用索引连接
如果覆盖索引变得非常宽,那么可能要考虑索引连接技术。索引连接技术使用两个或更多索引之间的一个索引交叉来完全覆盖一个查询。因为索引连接技术需要访问多余一个索引,它必须在所有索引连接中使用的索引上执行逻辑读。因此,索引连接需要比覆盖索引更高的逻辑读数量。但是,因为索引连接所用的多个窄索引能够比宽的覆盖索引服务更多的查询。所以索引连接也可以作为避免书签查找的一种技术来考虑。
参考资料: SQL SERVER书签查找 http://www.studyofnet.com/news/567.html
- SQL SERVER书签查找的介绍
- SQL SERVER 书签查找
- SQL Server书签查找
- 你需要明白的SQL SERVER书签查找(Bookmark Lookup)
- Sql Server查询性能优化之不可小觑的书签查找
- Sql Server查询性能优化之不可小觑的书签查找
- Sql Server查询性能优化之不可小觑的书签查找
- Sql Server查询性能优化之不可小觑的书签查找
- [转]Sql Server查询性能优化之不可小觑的书签查找
- 揭秘SQL Server 2000中的Bookmark Lookup--书签查找
- 揭秘SQL Server 2000中的Bookmark Lookup--书签查找
- 揭秘SQL Server 2000中的Bookmark Lookup--书签查找
- 性能优化--找到SQL SERVER中的书签查找
- 性能优化--找到SQL SERVER中的书签查找
- 索引,Sql查询性能优化,书签查找
- SQL Server索引进阶第六篇:书签
- SQL Server索引进阶第六篇:书签
- SQL Server xtype的介绍
- 阿里云Ubuntu部署java web(1) - 系统配置
- 常用Git命令总结
- 【烂尾】RedHat Linux 5 x64 安装 Hadoop-2.2.0
- Android:单元测试Junit的配置
- [java语法]基本语法(10) 关键字
- SQL SERVER书签查找的介绍
- mule中 JMS&AMQP(整理贴)
- Android Service 服务(一)—— Service
- 文件的输入输出 part1
- OpenSSL创建客户端、服务器证书,ios双向https认证
- 分享我在ios培训的那些事
- 《穆斯林的葬礼》读后感
- 突破上下文约束的泛型迁移计算模型
- C++ Primer学习笔记- 第三章:标准库类型之二