子查詢,連線查詢,在SQL2008R2中效能如何?

2022-07-13 22:51:23 字數 4320 閱讀 8905

以前或多或少的聽說過,能用子查詢的地方改用連線查詢,效能有提公升,如下的偽**

select *  from tab1 where col1 in (select col1 from tab2)

select * from tab1 inner

join tab2 on tab1.col1=tab2.col2

這種使用連線查詢代替子查詢的寫法,據說在sql2000中有效果,我沒有測試過,這次測試一下在sql2008r2中的效能如何?

首先看看獨立子查詢的邏輯讀:

set

statistics io on;

use adventureworks

godbcc freeproccache

checkpoint

dbcc dropcleanbuffers

select

count(*) from sales.salesorderheader as soh

where soh.salesorderid in

(select salesorderid from sales.salesorderdetail as sod

where orderqty>1

and sod.productid in

(select productid from production.product as p

where p.color=n'red'))

這段**的邏輯讀為:

(1 row(s) affected)

table 'worktable'. scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderheader'. scan count 1,logical reads 45, physical reads 2, read-ahead reads 43, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderdetail'. scan count 1, logical reads 1238, physical reads 35, read-ahead reads 1233, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'product'. scan count 1, logical reads 15, physical reads 4, read-ahead reads 20, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

再來看看使用連線查詢的邏輯讀:

dbcc freeproccache

checkpoint

dbcc dropcleanbuffers

select

count(distinct soh.salesorderid)

from sales.salesorderheader as soh

join sales.salesorderdetail as sod

on soh.salesorderid=sod.salesorderid

and sod.orderqty>1

join production.product as p on

sod.productid=p.productid

and p.color=n'red'

這段**的邏輯讀為:

(1 row(s) affected)

table 'worktable'. scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderheader'. scan count 1,logical reads 45, physical reads 2, read-ahead reads 43, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderdetail'. scan count 1,logical reads 1238, physical reads 35, read-ahead reads 1233, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'product'. scan count 1,logical reads 15, physical reads 4, read-ahead reads 20, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

另外看看連線查詢的第二種寫法,把color=n』red'放入where 子句中

dbcc freeproccache

checkpoint

dbcc dropcleanbuffers

select

count(distinct soh.salesorderid)

from sales.salesorderheader as soh

join sales.salesorderdetail as sod

on soh.salesorderid=sod.salesorderid

and sod.orderqty>1

join production.product as p

on sod.productid=p.productid

where p.color=n'red'

這段**的邏輯讀為:

(1 row(s) affected)

table 'worktable'. scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderheader'. scan count 1,logical reads 45, physical reads 2, read-ahead reads 43, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'salesorderdetail'. scan count 1,logical reads 1238, physical reads 34, read-ahead reads 1233, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

table 'product'. scan count 1,logical reads 15, physical reads 4, read-ahead reads 20, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

可以看到這三段**的邏輯讀是一樣的,效能上沒有任何的區別,看看從上到下三段**的執行計畫:

從上可以得到的結論:

2:對於查詢是這樣,對於update/delete也是如此,子查詢和連線查詢在sql2008中沒有任何的區別!!

sql 連線查詢 子查詢 聯合查詢

連線查詢 多表查詢 基本含義 連線就是指兩個或2個以上的表 資料來源 連線起來成為乙個資料來源 實際上,兩個表的完全的連線是這樣的乙個過程 左邊的表的每一行,跟右邊的表的每一行,兩兩互相 橫向對接 後所得到的所有資料行的結果。注意 連線之後,並非形成了乙個新的資料表,而只是一種 記憶體形態 基本形式...

sql連線查詢,子查詢和分頁查詢

內連線查詢,有效的去除笛卡爾積,分兩種 根據所使用的比較方式不同,內連線分為等值連線 自然連線和自連線三種 舉乙個自連線例子 select e.name,m.name from employees e join employees m on e.id m.id 分為左外連線和右外連線,用於查詢乙個表...

SQL2008中查詢外部EXECl檔案中的內容。。

在從遠端伺服器複製資料到本地時出現 sql server 阻止了對元件 ad hoc distributed queries 的 statement openrowset opendatasource 的訪問,因為此元件已作為此伺服器安全配置的一部分而被關閉。系統管理員可以通過使用 sp confi...