MSSQL2005-QUERY EXECUTION學習筆記之二

sqysl發表於2009-06-09

內容來自:Chapter 3. Query Execution---Analyzing plans
一、scan和seek:讀表或索引資料。
1、Seekable Predicates and Covered Columns:
(1)single-column indexes:一般來說,列上有函式或LIKE謂詞中有先導匹配符,都會組織使用該列上的索引,例如:
ABS([Col1]) = 1
[Col1] + 1 = 9
[Col1] LIKE '%abc'
(2)composite indexes:一般只有在索引第一列上有相等謂詞,才能是第二列上的謂詞使用索引,例如:
[Col1] = 3.14 AND [Col2] = 'pi'
[Col1] = 'xyzzy' AND [Col2] <= 0
而有些情況,我們只能使用第一列上的謂詞走索引,而第二列不走索引,這時我們稱第二列上上的謂詞為“剩餘謂詞”,例如:
[Col1] > 100 AND [Col2] > 100                      --第一列的謂詞不是相等謂詞
[Col1] LIKE 'abc%' AND [Col2] = 2
最後,我們可能連第一列上的謂詞都不能使用索引,這種情況下,就是直接不能使用索引,而應該更換其他索引,例如:
[Col2] = 0                                                                      --跳過了第一列
[Col1] + 1 = 9 AND [Col2] BETWEEN 1 AND 9        --第一列用在了計算表示式中
[Col1] LIKE '%abc' AND [Col2] IN (1, 3, 5)                --第一列謂詞LIKE中用到了先導萬用字元
(3)Identifying an Index's Keys:在一個已經有簇索引的表上建立一個非唯一非簇索引時,該索引會隱含簇索引的鍵值。
(4)Covered Columns:堆和簇索引包含表的所有列,而非簇索引僅僅覆蓋基表的一部分列,當然,如果基表上有簇索引,非簇索引還包括簇索引的鍵值,無論給非簇索引是否包含簇關鍵字,在mssql2005中,我們能用create index的include子句為索引新增非鍵列,索引的排序和這些新增的非鍵列無關,例如:
CREATE TABLE T_heap (a int, b int, c int, d int, e int, f int)CREATE INDEX T_heap_a ON T_heap (a)CREATE INDEX T_heap_bc ON T_heap (b, c)CREATE INDEX T_heap_d ON T_heap (d) INCLUDE (e)CREATE UNIQUE INDEX T_heap_f ON T_heap (f)CREATE TABLE T_clu (a int, b int, c int, d int, e int, f int)CREATE UNIQUE CLUSTERED INDEX T_clu_a ON T_clu (a)CREATE INDEX T_clu_b ON T_clu (b)CREATE INDEX T_clu_ac ON T_clu (a, c)CREATE INDEX T_clu_d ON T_clu (d) INCLUDE (e)CREATE UNIQUE INDEX T_clu_f ON T_clu (f)
Table 3-3. Key Columns and Covered Columns in a Set of Nonclustered IndexesIndexKey ColumnsCovered ColumnsT_heap_aaaT_heap_bcb, cb, cT_heap_ddd, eT_heap_fffT_clu_aaa, b, c, d, e, fT_clu_bb, aa, bT_clu_aca, ca, cT_clu_dd, aa, d, eT_clu_ffa, f
這裡注意,唯一性索引T_chu_f的鍵值列中,並不包含簇索引的鍵值列,但它覆蓋了簇索引鍵值列,這是唯一性索引的與其他非簇索引的特別之處。
(5)Bookmark Lookup:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-605579/,如需轉載,請註明出處,否則將追究法律責任。

相關文章