科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件SQL Server 索引基础知识(9)----Indexing for OR

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文是通过例子来理解OR运算符的特征。

作者:ghj1976 来源:CSDN 2008年2月11日

关键字: Indexing SQL Server

  • 评论
  • 分享微博
  • 分享邮件

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

我们仍然使用 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 操作符对查询的影响

 

知识点小结:

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搜索关键字的对应索引。则系统会使用这个索引。
  • 如果没有,则遍历(表遍历或者索引遍历)是高性能的选择。

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章