蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 673, 评论 - 4416, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Iefdndcu
    real beauty page <a href=" http://www.wikio.com/user/geebypubeel/bio "&...
    by Iefdndcu(匿名) on 2010/3/21 22:39:25
  • Uuorbsjt
    This site is crazy :) <a href=" http://www.wikio.com/user/inohedos/bio "&am...
    by Uuorbsjt(匿名) on 2010/3/21 22:39:08
  • Kkckitku
    real beauty page <a href=" http://www.wikio.com/user/geebypubeel/bio "&...
    by Kkckitku(匿名) on 2010/3/21 22:38:54
  • Dqcrmtcw
    Best Site Good Work <a href=" http://www.wikio.com/user/okefykyhyac/bio "&a...
    by Dqcrmtcw(匿名) on 2010/3/21 21:50:46
  • Kfdedlzo
    Very interesting tale <a href=" http://www.wikio.com/user/okefykyhyac/bio "...
    by Kfdedlzo(匿名) on 2010/3/21 21:50:45
  • Efapakcv
    good material thanks <a href=" http://www.wikio.com/user/qelytoiniq/bio "&a...
    by Efapakcv(匿名) on 2010/3/21 21:50:44
  • Syffkefi
    Gloomy tales <a href=" http://www.wikio.com/user/ybaquqeun/bio ">pic...
    by Syffkefi(匿名) on 2010/3/21 20:31:00
  • Ymipnkir
    i'm fine good work <a href=" http://www.wikio.com/user/irucilury/bio "&...
    by Ymipnkir(匿名) on 2010/3/21 20:30:44
  • Cnmevoyw
    Excellent work, Nice Design <a href=" http://www.wikio.com/user/qelytoiniq/bio &...
    by Cnmevoyw(匿名) on 2010/3/21 20:30:31
  • Gncuydae
    Thanks funny site <a href=" http://www.wikio.com/user/myaedet/bio ">...
    by Gncuydae(匿名) on 2010/3/21 19:43:40

广告

 

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

打印 | 张贴于 2008-01-18 14:34:00 | Tag:技术随笔  数据库开发管理心得

留言反馈

#回复: SQL Server 索引基础知识(9)----Indexing for OR 编辑
谢谢楼主分享,学习了!
2008-01-23 11:51:00 | [匿名:SolidWorks]
#回复: SQL Server 索引基础知识(9)----Indexing for OR 编辑
SELECT m.LastName, m.FirstName, m.Region_NoFROM dbo.Member AS mWHERE m.FirstName = 'Kimberly' OR m.LastName = 'Tripp'go
select m.LastName, m.FirstName, m.Region_NoFROM dbo.Member AS m with(index(member_ident)),(select ww.Member_No from (select Member_No from dbo.Member where FirstName = 'Kimberly'union allselect Member_No from dbo.Member where LastName = 'Tripp') wwgroup by ww.Member_No) nwhere m.Member_No = n.Member_Nogo
似乎会有重复吧

语句一似乎是mssql自己优化的结果。
不过最好还是用union替代or in
2008-01-19 20:16:00 | [匿名:xx]

发表留言

标题
姓名
邮件
主页
留言 

Powered by: Joycode.MVC引擎 0.5.2.0