2013-03-11 85 views
0

當我們在屬性上創建索引時,我們會更快地找到記錄,因爲索引是一棵樹,我們瀏覽排序順序的值。
例如對於SELECT * from branches where name='Washington通過索引,我們將按字典順序導航以在記錄時間內達到記錄。
但是,當我們在連接中使用的列索引時,這是如何工作的?
例如連接的索引列

SELECT BILLS.NAME NAME, BILLS.AMOUNT AMOUNT FROM BILLS,BANK_ACCOUNTS WHERE BILLS.ACCOUNT_ID = BANK_ACCOUNTS.ACCOUNT_ID 

如果我們已經創建了一個指數BILLS(ACCOUNT_ID)BANK_ACCOUNTS(ACCOUNT_ID)是怎樣的導航速度更快?我們只取每個值BANK_ACCOUNTS.ACCOUNT_ID,並使用BILLS的索引樹來查找匹配記錄?
如果這是如何工作的,那麼爲什麼人們通常會建議在連接中使用的列中創建索引。
在我看來,只有1個索引被創建,並且將用於等號比較器左側的表格,即BILLS。或者我錯了?

+2

你應該閱讀[all of this](http://use-the-index-luke.com/) - 尤其是* Join Operation *部分。 – 2013-03-11 21:58:49

回答

0

您提供的代碼示例代碼是BILLS和BANK_ACCOUNTS之間的INNER JOIN,因此只會返回存在於BANK_ACCOUNTS中的BILLS中的行。在查詢運行時,通過僅對BANK_ACCOUNTS上的非聚集索引執行連接來檢查此查詢,因爲來自BANK_ACCOUNTS的由查詢引用的所有字段(即BANK_ACCOUNTS.ACCOUNT_ID)都是索引的一部分,因此「覆蓋「 通過它。

在索引中查找BANK_ACCOUNTS.ACCOUNT_ID是O(log N),而每次查找的BANK_ACCOUNTS掃描都是O(N)。

這有幫助嗎?

+0

不確定。「僅對BANK_ACCOUNTS'上的非聚集索引執行連接這意味着它會忽略該表並僅在索引上進行連接? – Cratylus 2013-03-11 22:13:09

+0

@Cratylus:是的,這就是「覆蓋」查詢的索引。也就是說,當讀取索引記錄提供查詢的所有必需字段時,引擎知道不會浪費週期讀取聚集索引中的完整記錄。 – 2013-03-11 23:09:54