加入或设置更快执行的运算符

时间:2016-05-12 08:34:04

标签: sql sql-server-2012

SELECT product_id FROM inventories
INTERSECT
SELECT product_id FROM order_items;

SELECT product_id FROM inventories T1
    inner join order_items t2 on T1.product_id = T2.product_id;

1 个答案:

答案 0 :(得分:0)

出于好奇,我做了一些测试

<强>要点:
1.当查询成本和执行时间作为参数时,如果没有索引,则set query略有效 2.当查询成本,读取次数,执行次数作为参数时,索引设置选项比基于连接的查询有效

演示脚本:

drop table #test2

    create table #test1
    (
    id int
    )

    create table #test2
    (
    id int
    )

    insert into #test1
    select * from numbers


insert into #test2
select * from numbers where id>10


set statistics io on


 create index nxc on #test1(id)
 create index nxc2 on #test2(id)


 select id from #test1
intersect 
select id from #test2

select 
* from 
#test1 t1
join
#test2 t2
on t1.id=t2.id

多次执行两次查询:

使用索引

enter image description here

根据阅读次数查询费用:

  

表'#test2 ______________________________________________________________________________________________________________ 000000000028'。扫描计数1,逻辑读取2239,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。   表'#test1 ______________________________________________________________________________________________________________ 000000000027'。扫描计数1,逻辑读取2239,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。

查询2:使用联接

  

表'#test2 ______________________________________________________________________________________________________________ 000000000028'。扫描计数5,逻辑读取1609,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。   表'#test1 ______________________________________________________________________________________________________________ 000000000027'。扫描计数5,逻辑读取1610,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0。

更改连接查询以使用maxdop 1和合并连接提示会导致两个查询的读取次数相同,但是当两者并行执行时,使用set选项的查询仅占总成本的3%。

没有索引:读取次数相对相同
enter image description here

注意:
生成的测试和执行计划取决于我的系统基于几个因素