SQL Server 索引基础知识(9)----Indexing for OR
2008-01-18 14:33
337 查看
我们仍然是通过例子来理解OR运算符的特征
我们仍然使用 http://blog.joycode.com/ghj/archive/2008/01/18/113870.aspx 中的 member 表,这时候,这个表的索引如下:
我们执行下面的查询
我们用另外一个SQL来模拟 SQL 的执行计划,就是下面的语句:
我们会看到上面语句跟下面的语句基本一样,只是一个是 Key Lookup ,一个是 Clustered Index Seek。 这里由于是模拟情况,可以认为是一样的。
这两个查询的扫描计数均是 2,逻辑读取均是 10 次。
他们俩个的执行计划如下图,点击看大图:
知识点小结:
OR 会做什么?
将多个结果集集合起来,上图中,使用 Merge Join(Concatenation)把数据汇集起来。
保证每一个row只出现一回,上图中,使用Stream Aggregate(Aggregate)进行排重。
上面的例子中,我们用 union 来演示 or的情况。 OR和UNION相似。不同之处如下:
OR 根据 row’s unique identifier (RID or Clustering Key) 去掉副本
UNION 根据 SELECT list 去掉副本
UNION ALL 不去除副本
OR 的一个简单应用就是 In 关键字。
如果有In搜索关键字的对应索引。则系统会使用这个索引。
如果没有,则遍历(表遍历或者索引遍历)是高性能的选择。
我们仍然使用 http://blog.joycode.com/ghj/archive/2008/01/18/113870.aspx 中的 member 表,这时候,这个表的索引如下:
名字 | 描述 | 列 |
member_corporation_link | nonclustered located on PRIMARY | corp_no |
member_ident | clustered, unique, primary key located on PRIMARY | member_no |
member_region_link | nonclustered located on PRIMARY | region_no |
MemberFirstName | nonclustered located on PRIMARY | firstname |
MemberLastName | nonclustered located on PRIMARY | lastname |
SELECT m.LastName, m.FirstName, m.Region_No FROM dbo.Member AS m WHERE m.FirstName = 'Kimberly' OR m.LastName = 'Tripp' go
我们用另外一个SQL来模拟 SQL 的执行计划,就是下面的语句:
我们会看到上面语句跟下面的语句基本一样,只是一个是 Key Lookup ,一个是 Clustered Index Seek。 这里由于是模拟情况,可以认为是一样的。
select m.LastName, m.FirstName, m.Region_No FROM dbo.Member AS m with(index(member_ident)), ( select ww.Member_No from ( select Member_No from dbo.Member where FirstName = 'Kimberly' union all select Member_No from dbo.Member where LastName = 'Tripp' ) ww group by ww.Member_No ) n where m.Member_No = n.Member_No go
这两个查询的扫描计数均是 2,逻辑读取均是 10 次。
他们俩个的执行计划如下图,点击看大图:
知识点小结:
OR 会做什么?
将多个结果集集合起来,上图中,使用 Merge Join(Concatenation)把数据汇集起来。
保证每一个row只出现一回,上图中,使用Stream Aggregate(Aggregate)进行排重。
上面的例子中,我们用 union 来演示 or的情况。 OR和UNION相似。不同之处如下:
OR 根据 row’s unique identifier (RID or Clustering Key) 去掉副本
UNION 根据 SELECT list 去掉副本
UNION ALL 不去除副本
OR 的一个简单应用就是 In 关键字。
如果有In搜索关键字的对应索引。则系统会使用这个索引。
如果没有,则遍历(表遍历或者索引遍历)是高性能的选择。
相关文章推荐
- SQL Server 索引基础知识(9)----Indexing for OR
- SQL Server 索引基础知识(9)----Indexing for OR
- SQL Server 索引基础知识(9)----Indexing for OR(转自蝈蝈俊.net)
- SQL Server 索引基础知识(9)----Indexing for OR
- SQL Server 索引基础知识(7)----Indexing for AND(转自蝈蝈俊.net)
- SQL Server 索引基础知识(7)----Indexing for AND
- SQL Server 索引基础知识(7)----Indexing for AND
- SQL Server 索引基础知识(7)----Indexing for AND
- [转]SQL Server 索引基础知识(1)--- 记录数据的基本格式
- SQL Server 索引基础知识(4)----主键与聚集索引
- SQL Server 索引基础知识(10)----Join 时的三种算法简介
- SQL Server 索引基础知识(6)----索引的代价,使用场景
- SQL Server 索引基础知识(8)--- 数据基本格式补充
- SQL Server 索引基础知识(3)----测试中一些常看的指标和清除缓存的方法(转自蝈蝈俊.net)
- SQL Server 索引基础知识(10)----Join 时的三种算法简介(转自蝈蝈俊.net)
- SQL Server 索引基础知识(2)
- SQL Server 索引基础知识(1)--- 记录数据的基本格式
- SQL Server 索引基础知识(10)----Join 时的三种算法简介
- [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引
- SQL Server 索引基础知识(4)----主键与聚集索引