WHERE谓词对索引使用的影响
本篇博文只测试WHERE谓词对multi-column index使用的影响,主要篇幅是SQL代码+截图。详细内容请参考《Inside the SQL Server Query Optimizer 》--Benjamin Nevarez,Chapter 4:Index Selection-->The Mechanics of Index Selection(Page124).
--利用AdventureWorks.Sales.SalesOrderDetail 创建临时表
SELECT * INTO dbo.SalesOrderDetail
FROM Sales.SalesOrderDetail
--运行下面语句查看执行计划
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail --table scan
--创建复合索引
CREATE INDEX multi_column ON dbo.SalesOrderDetail(ProductID,SalesOrderID)
--分别运行在索引第一列、第二列的 where条件查询
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ProductID=771 --index seek
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE SalesOrderID=45233 --index scan
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ABS(ProductID)=771 --talbe scan
--分别运行在索引第一列、第二列的 where条件查询
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ProductID=771 AND SalesOrderID> 45233 --seek ProductID,seek SalesOrderID
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ProductID=771 AND ABS(SalesOrderID)=45233 --seek ProductID,scan SalesOrderID
SELECT ProductID,SalesOrderID,SalesOrderDetailID FROM dbo.SalesOrderDetail
WHERE ProductID<771 AND SalesOrderID=45233 --seek ProductID,scan SalesOrderID
索引第一列为‘=’,第二列没含操作表达式,则两列都可以用 seek,与where 后面的顺序无关
索引第一列为‘=’,第二列有操作表达式 (abs,upper,convert...),则第一列seek,第二列 scan,与where 后面的顺序无关
索引第一列不是‘=’,则第一列 seek,第二列scan ,与where后面的顺序无关
DROP TABLE dbo.SalesOrderDetail --删除测试表
WHERE谓词对索引使用的影响的更多相关文章
- SQLServer中重建聚集索引之后会影响到非聚集索引的索引碎片吗
本文出处:http://www.cnblogs.com/wy123/p/7650215.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- mysql添加索引造成的影响
尽管添加索引可以优化SQL语句的性能,但是添加索引的同时也会带来不小的开销.尤其是在有大量的索引的情况下. mysql添加索引造成的影响如下: 1.DML(数据操作语言)影响,在表上添加缩影会直接影响 ...
- Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Null 值对索引排序的影响案例一则
--原SQL 语句如下:select * from (select tmp_tb.*, ROWNUM row_id from (select wpid, customer_id, customer_n ...
- Oracle分区索引
索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局分区索引) 下面就来详细解 ...
- oracle 性能优化--索引总结
索引是建立在表的一列或多个列上的辅助对象,目的是加快訪问表中的数据: Oracle存储索引的数据结构是B*树.位图索引也是如此,仅仅只是是叶子节点不同B*数索引: 索引由根节点.分支节点和叶子节点组成 ...
- Oracle 创建索引的基本规则总结
1. 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracle在UNIQUE和主键字 ...
- oracle(七)索引
一.B-Tree索引 (1). 选择索引字段的原则: 在WHERE子句中最频繁使用的字段 联接语句中的联接字段 选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好) Oracl ...
- SQL 创建索引,语法
索引介绍.及原理 主键,唯一索引 聚集索引的关系 当数据库表的数据太过庞大,的时候我们能够通过加入索引的形式解决. 聚集索引:数据的实际存储顺序与我们做索引的顺序是一致的,这样的索引我们将它成为聚集索 ...
随机推荐
- panel,dialog,window组件越界问题汇总
之前分别写过panel,dialog,window三个组件因为拖曳或者reSize造成组件越界而无法还原的问题,两篇文章分别针对拖曳和reSize给出了解决方案.不过根据朋友的反馈,reSize的解决 ...
- html5 data
对于html5 的data使用 <div id='testDiv' data-value='123' data-name='china'> 通过var v = document.getLE ...
- twistd 启动Python服务
twistd 启动Python服务 shell 脚本如下: #! /usr/bin/env sh MAIN_MODULE=pdf_task.py ROOT="/var/www/pdf/&qu ...
- node.js 初体验
node.js 初体验 2011-10-31 22:56 by 聂微东, 174545 阅读, 118 评论, 收藏, 编辑 PS: ~ 此篇文章的进阶内容在为<Nodejs初阶之express ...
- PHP面向对象程序设计的61条黄金法则
PHP面向对象程序设计的61条黄金法则 你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚.但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起 . ----- Arthur J.R ...
- 自动配置IP地址.bat
※※※※※※※※※※※※※※※※※※※※※※※※※※※※ @echo ※ ※ @echo ...
- EditPlus使用心得及常用快捷键
下载好烈火版EditPlus_4.00.465_SC 然后去官网下载自动补全ACP文件 我用的是php_stx_acp.zip 解压到editplus4主目录下 然后打开软件-设置-参数 先调字 ...
- Bootstrap页面布局15 - BS带下拉菜单的按钮
带下拉菜单的按钮 <div class='btn-toolbar'> <div class='btn-group'> <a href='javascript:;' cla ...
- Linux常用命令-入门
linux 开源安全性高 linux 和 windows 1.同时登陆多用户 2.安全 3.linux没有盘符的概念 /. / root 根目录 4.linux的文件没有扩展名 ...
- prepare PDO
<?php $sql='SELECT email FROM users WHERE id = :id'; $statement=$pdo->prepare($sql);$userId=fi ...