SQL Server 的欄位設計 v.s. 索引

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 種的話,俺也認了………….. )

Tags: , ,

SQL Server

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading






關於我們

這裡是由一群熟悉 Microsoft IT 技術的工程師所共同分享技術文章的部落格,除了定期分享工作上的技術經驗,我們也提供專業的技術顧問諮詢服務,有任何疑難雜症都歡迎與我們聯絡!

  • 陳冠龍(Owen)
  • 02-2322-2480 # 33
  • 陳昌賢(Mars)
  • 02-2322-2480 # 16
  • 有任何的建議或問題,請來信 [email protected]

※ 學習資源:
    2016/3/9 - 你所不知道的 Microsoft Azure 雲端採購技巧
    (講者:多奇數位技術總監 - Will 保哥)

最新消息

企業上雲端會是未來趨勢

微軟主打 2 種公有雲平台

Office 365 & Azure

有興趣皆可來電 or E-Mail 詢問

Calendar

<<  November 2024  >>
MoTuWeThFrSaSu
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

View posts in large calendar