以前或多或少的聽說過,能用子查詢的地方改用連線查詢,效能有提公升,如下的偽**
這種使用連線查詢代替子查詢的寫法,據說在sql2000中有效果,我沒有測試過,這次測試一下在sql2008r2中的效能如何?select * from tab1 where col1 in (select col1 from tab2)select * from tab1 inner
join tab2 on tab1.col1=tab2.col2
首先看看獨立子查詢的邏輯讀:
這段**的邏輯讀為:setstatistics 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 freeproccachecheckpoint
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)另外看看連線查詢的第二種寫法,把color=n』red'放入where 子句中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 freeproccachecheckpoint
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...