SQL Server 索引基础知识(9)----Indexing for OR

SQL Server 索引基础知识(9)----Indexing for OR

作者:郭红俊

时间:January 18, 2008

我们仍然是通过例子来理解 OR运算符的特征

我们仍然使用SQL Server 索引基础知识(7)----Indexing for ANDUse SHIFT+ENTER to open the menu (new window). 中的 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

我们执行下面的查询


  
  
  1. SELECT m.LastName, m.FirstName, m.Region_No
  2. FROM dbo.Member AS m
  3. WHERE m.FirstName = 'Kimberly'
  4. OR m.LastName = 'Tripp'
  5. go

我们用另外一个 SQL来模拟 SQL 的执行计划,就是下面的语句:
我们会看到上面语句跟下面的语句基本一样,只是一个是 Key Lookup ,一个是 Clustered Index Seek。 这里由于是模拟情况,可以认为是一样的。


  
  
  1. select m.LastName, m.FirstName, m.Region_No
  2. FROM dbo.Member AS m with(index(member_ident)),
  3. (
  4. select ww.Member_No from (
  5. select Member_No from dbo.Member where FirstName = 'Kimberly'
  6. union all
  7. select Member_No from dbo.Member where LastName = 'Tripp'
  8. ) ww
  9. group by ww.Member_No
  10. )
  11. n
  12. where m.Member_No = n.Member_No
  13. 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搜索关键字的对应索引。则系统会使用这个索引。
  • 如果没有,则遍历(表遍历或者索引遍历)是高性能的选择。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值