2017-03-17 37 views
0

我正在閱讀Ben Itzik的「Tsql Fundamental」。爲什麼操縱過濾列會影響索引效率?

作者簡單地提到,如果我們想要高效地使用索引,我們不應該操縱已過濾的列。但他並沒有詳細說明爲什麼會出現這種情況。

那麼,有人可以請解釋它背後的原因嗎?

回答

2

筆者簡要地提到,我們不應該操縱過濾柱,如果我們要使用索引有效

什麼作者提到被稱爲SARGABILITY

假設這種說法

select * from t1 where name='abc' 

假設,你有上述過濾柱

索引,則查詢優化搜索

但不低於一個

select * from t1 where len(name)=3 

當SQL是用上面的查詢來提供的,唯一的辦法就是可以將數據過濾掉掃描表格,然後將謂詞應用到每一行

2

想象索引就像電話簿一樣(希望這仍然是一個足夠熟悉的概念),其中每個人都按姓氏排列,然後是他們的地址。

如果您想查找某人的電話號碼並知道他們的姓氏(也可能是他們的地址),此索引非常有用。

但是,如果你想找到誰(盜取TheGameiswar's example)有3個字母姓氏的人 - 是否對你有用?這可能比必須去參觀鎮上的每個房子稍微有用,但它不能像跳到適當的姓氏那樣有效。你必須搜索整本書。

同樣,如果你想找到住在特定街道上的每個人,索引是不是很有用 - 你必須搜索整本書,以確保你找到了每個人。或查找,大家誰姓結束Son


這是當一個數據庫可以選擇執行索引掃描來滿足查詢,只是因爲索引更小的類比所以比全表掃描更容易。

這是一個查詢的類比,它不會嘗試過濾索引中最左邊的列。

1

SQL查詢中的WHERE子句使用謂詞來過濾行。謂詞是一個表達式,用於確定應用於數據庫對象的參數是true還是false。例如:「薪水> 5000」。

關係模型使用謂詞作爲過濾數據的核心元素。這些謂詞應該以稱爲「搜索參數」的某種形式編寫,以便查詢優化器有效地使用WHERE子句中用於過濾數據的屬性的索引。 謂詞形式 - 「列 - 運算符 - 值」或「值 - 運算符 - 列」被視爲合適的搜索參數。示例 - 工資= 1000或工資> 5000。如您所見,列名應在表達式的一側出現ALONE,常數或計算值應在另一側以形成有效的搜索參數。在列名稱上使用MAX,MIN,DATEADD或DATEDIFF等內置函數時,表達式不再被視爲搜索參數,查詢優化器不會使用這些列名稱上的索引。

我希望這很清楚。