by Joseph Wu
25. October 2011 10:51
今天一大清晨,致學老師來我們這邊進行最後的效能調校測試,剛好在中間空檔可以請教問題。( 致學老師人真是太好了,每次來做顧問,都一直被我問問題…… )
今天談到了 SQL Server 如何來使用 Where ,歸納了幾點如下:
1、萬用字元請小心使用 ( 注意別將萬用字元放在搜尋字串的第 1 個字元 )
首先假設我們的 table 是有建立索引的
舉例來說,使用 where columns like ‘AB%’ ,SQL Server 在接到指令會其實是會轉換成類似 columns >= AB and columns < AC 來進行搜尋,如此一來我們就可使用索引來大幅提故搜尋效率;但是,如果是使用 where columns like ‘%AB’ , 那就抱歉了, SQL Server 的搜尋方式是 table scan ,有幾筆資料就要搜尋幾次 ( 試想有超過百萬筆資料的話…… )
2、必須運算的欄位 ( 如果運算邏輯是一致的,請多加運算後欄位,並將該欄位建置索引 )
同樣舉例來說,我們在資料庫中有一個欄位很常需要做 substring 。 只要一使用 substring 時,就會將該欄位的所有資料,一筆一筆的進行 substring 。 如果每次運算的邏輯是一樣,建議在 insert 資料時,也多 insert 一個運算後的欄位,在將該欄位建立索引,以後如果要搜尋欄位,便可利用索引大幅提升效率。
3、資料庫欄位中如有 status 、 flag 等資料時,擴大判斷數字
這不舉例應該很難理解唄 = =
假設我們有一個 table 是專門存放簡訊收發相關資訊,該 table 有一個欄位是 status ,而 status 有包含 ok (確實收到訊息)、 cn (無訊號)、 ck (使用者簡訊量爆掉) 、cx 、ci 等代表不同種類的回應訊息。 每個種類的回應訊息都有被賦予一個數字,該數字的欄位名稱是 status_number。
重點來了喔………..,
如果數字是連續的 !!!
ok = 1 、 cn = 2 、 …… 依此類推。 試問,如果以後又多了一種回應訊息是代表使用者有收到簡訊,假設是 kk = 6 。 問題來了,管理者想知道所有成功的回應訊息,那不就要 where status_number = 1 or 6 。這代表,table scan 又來了……
所以可以將成功訊息擴大,例如,成功相關訊息是 1~50 ,失敗相關訊息是 51~100 。這樣搜尋語法可改為 where status_number < 50 ,就可以使用索引了。 ( 如果成功訊息大於 50 種的話,俺也認了………….. )