Agenda
前文
本篇會分享在撰寫SQL時建議和比較分享
永遠先考慮T-SQL改寫
- 符合SARG Statement進行撰寫
- <、>、=、<=、>=、LIKE(視%所在位置,前面有%讓DB engine選擇不走INDEX)
- 不要在
Where
欄位做運算 - 使用
ANSI 92
相容的Join方式連接資料庫(避免使用舊式Join
) - 避免row by row操作
符合SARG格式的撰寫 + 適當Index設計可以解決大部分的效能問題
使用Like查詢建議
- 盡量別把
%
放在前面 - 如果查詢條件是
CNAME LIKE '%范'
想讓讓查詢走索引(seek 查詢),在後面加一個條件AND CNAME > ''
讓查詢走Seek.
1 | SELECT [MID] |
使用Count函數建議
如果要取得筆數數量使用COUNT(*)
比Count(c1)
效能好.
Count(c1)
會忽略c1 IS NULL
數量.
另外如果[資料筆數]>2^15-1(大於INT最大值)筆數量可使用
count_big(*)
方法
如果需要COUNT
資料很大造成效能影響可以透過DMV
取得當前資料表數量(資料會不準確,因為並非及時更新)
1 | SELECT SUM(p.rows) |
使用if exists (select 1 from dbo.table)
取代count
函式判斷資料是否存在
NOT IN vs NOT EXISTS
在查詢時避免使用NOT IN
,因為會被QO改寫成 <> NULL
,在SQL中NULL
代表不知道(Unknow),所以會什麼都查不到
- 因為此欄位是可空(
NULL
)時會造成非預期結果(因為NULL
會造成判斷失誤NULL
不是一個值他代表未知) - 使用
NOT EXISTS
替代NOT IN
NOT EXISTS
在可空欄位效能比NOT IN
還要好(如果有建立Index
兩個產生執行計畫理論上是一樣)
下面有一個範例來解說為什麼避免在可空欄位使用NOT IN
1 | CREATE TABLE T( |
上圖可以看到在T
資料表中有兩筆資料,如果我們使用NOT IN
和NOT EXISTS
結果會不一樣,原因是使用NOT IN
在判斷NULL
時會造成NULL<>
任何值,所以就撈不出任何資料,相反使用NOT EXISTS
取得的結果就符合我們預期.
避免在Where條件中對欄位進行操作運算
@col > ‘’ 替代 @col NOT NULL AND <> ‘’
我們會有一種需求須要判斷此
1 | CREATE TABLE T( |
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/dbnote/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!