用 UNION 取代 OR

巧玫 mail 了一個有趣的連結

http://sqlserverplanet.com/optimization/using-union-instead-of-or

/*

總紀錄 704 筆

SQL Server 剖析與編譯時間:
CPU 時間 = 15 ms,經過時間 = 18 ms。

(704 個資料列受到影響)
資料表 ‘SalesOrderDetail’。掃描計數 2,邏輯讀取 2179,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 0 ms,經過時間 = 201 ms。

*/
SELECT *
FROM sales.SalesOrderDetail
WHERE ProductID = 750
UNION
SELECT *
FROM sales.SalesOrderDetail
WHERE ProductID = 953

/*
SQL Server 剖析與編譯時間:
CPU 時間 = 0 ms,經過時間 = 0 ms。

(704 個資料列受到影響)
資料表 ‘SalesOrderDetail’。掃描計數 1,邏輯讀取 1246,實體讀取 0,讀取前讀取 0,LOB 邏輯讀取 0,LOB 實體讀取 0,LOB 讀取前讀取 0。

SQL Server 執行次數:
,CPU 時間 = 47 ms,經過時間 = 234 ms。
*/
SELECT *
FROM sales.SalesOrderDetail
WHERE ProductID = 750 OR ProductID = 953

image

 

因為 OR 造成 SQL Server 判讀符合的紀錄較多,認定需要 Scan table,但 Union 是個別判讀獨自兩句,各自認定符合的紀錄少,因此 Seek 比較好

透過 set statistics io on 與 set statistics time on 與兩句話加在一起比執行計畫:

總 IO 數是 union 較多,所以就執行計畫的比較,SQL Server 認定 OR 比較好。但因為 OR 的 Filter 較耗 CPU,所以真實的總時間上 Union 較好。且因為 Union 個別執行較省 CPU,所以多人同時存取時,也比較好。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: