3 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
看一下這樣的索引:
Cols
1 2 3
-------------
| | 1 | |
| A |---| |
| | 2 | |
|---|---| |
| | | |
| | 1 | 9 |
| B | | |
| |---| |
| | 2 | |
| |---| |
| | 3 | |
|---|---| |
看到第一列限制比第一列限制消除更多結(jié)果的方式如何限制第一列?如果您想象必須如何遍歷索引,第1列然后第2列,等等,會(huì)更容易。。。您會(huì)發(fā)現(xiàn),第一遍中大部分結(jié)果的丟失使第二步快得多。
另一種情況,如果您查詢第3列,則優(yōu)化器甚至都不會(huì)使用索引,因?yàn)樗鼘s小結(jié)果集完全沒有幫助。 隨時(shí)在查詢中,在進(jìn)行下一步之前,縮小要處理的結(jié)果數(shù)的范圍即可提高性能。
由于索引也是以這種方式存儲(chǔ)的,因此在查詢索引時(shí),不會(huì)在索引上回溯以找到第一列。
簡而言之:不,這不是為了展示,而是有真正的性能優(yōu)勢。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
列的順序至關(guān)重要?,F(xiàn)在哪個(gè)順序正確,取決于您要查詢的順序。索引可用于執(zhí)行精確搜索或范圍掃描。精確查找是指指定索引中所有列的值,并且查詢恰好位于該行所關(guān)注的位置。對于查找,列的順序無關(guān)緊要。范圍掃描是僅指定一些列的情況,在這種情況下,順序變得很重要。只有指定了最左列,然后指定了下一個(gè)最左列,SQL Server才可以將索引用于范圍掃描。如果您對(A,B,C)的索引可以用來范圍掃描A=@a
,為A=@a AND B=@b
但不為B=@b
,對于C=@c
也不B=@b AND C=@c
。情況A=@a AND C=@c
是混合的,例如A=@a
部分將使用索引,但C=@c
不使用索引(查詢將掃描所有B值的A=@a
,不會(huì)“跳到” C=@c
)。其他數(shù)據(jù)庫系統(tǒng)具有所謂的“跳過掃描”運(yùn)算符,當(dāng)未指定外部列時(shí)可以利用索引中的內(nèi)部列。
掌握了這些知識(shí)之后,您可以再次查看索引定義。(MostSelective, SecondMost, Least)
僅當(dāng)MostSelective
指定column 時(shí),索引on 才有效。但是,最有選擇性的是,內(nèi)部列的相關(guān)性將迅速降低。很多時(shí)候,您會(huì)發(fā)現(xiàn)(MostSelective) include (SecondMost, Least)
或上有一個(gè)更好的索引(MostSelective, SecondMost) include (Least)
。由于內(nèi)部列的相關(guān)性較低,因此將低選擇性列放置在索引中的此類正確位置上只會(huì)使它們產(chǎn)生尋找噪音,因此將它們移出中間頁并僅將它們保留在葉子頁上是有意義的,因?yàn)椴樵兏采w率的目的。換句話說,將它們移動(dòng)到INCLUDE。隨著Least
列大小的增加,這一點(diǎn)變得更加重要。想法是該索引只能使指定以下內(nèi)容的查詢受益MostSelective
無論是精確值還是范圍,該列的選擇性最高,已經(jīng)在很大程度上限制了候選行。
另一方面,上的索引(Least, SecondMost, MostSelective)
看似錯(cuò)誤,但實(shí)際上它是一個(gè)功能強(qiáng)大的索引。因?yàn)樗哂?code>Least列作為其最外面的查詢,所以它可用于必須在低選擇性列上聚合結(jié)果的查詢。這樣的查詢在OLAP和分析數(shù)據(jù)倉庫中很普遍,而這正是此類索引非常適合的地方。這樣的索引實(shí)際上是出色的聚集索引,正是因?yàn)樗鼈儗⑽锢聿季纸M織在大塊相關(guān)行上(相同的Least
值,通常表示某種類別或類型),并且有助于分析查詢。
因此,不幸的是,沒有“正確”的命令。您不應(yīng)該遵循任何曲奇工具的配方,而應(yīng)針對這些表分析將要使用的查詢模式,并確定哪個(gè)索引列順序正確。
添加回答
舉報(bào)