2012-06-27 139 views
1
SELECT * 
FROM 
    tbl_transaction t 
LEFT JOIN 
    tbl_transaction_hsbc ht 
ON 
    t.transactionid = ht.transactionid 

transactionid這兩個表是主鍵所以爲什麼沒有索引尋找?聚簇索引掃描而不是聚簇索引尋求左連接

+0

主鍵並不一定暗示集羣索引.. –

+2

@Pabloker集羣或不是真的沒關係。在這兩種情況下如何尋求工作? –

+1

如果您不得不在紐約大都會地區電話簿中大聲朗讀每個人的姓氏,名字和電話號碼,您是否希望通過網頁按順序(掃描)來完成,還是您希望按電話號碼進行訂購使用只有電話和姓氏的反向電話號碼索引,按字母順序查找每個姓氏,並查找與當前電話號碼(書籤查找/查找)關聯的名字? – ErikE

回答

6

也許這是SELECT * ...也許是因爲你要返回整個表格,沒有什麼好處。你想要做什麼,逐步尋找每一行?掃描效率更高。

我意識到你可能已經閱讀或被告知不惜一切代價避免掃描。我認爲這需要更多的背景。有時候掃描是正確的答案,也是最有效的數據路徑。如果查詢速度慢,也許您可​​以展示實際的執行計劃,我們可以幫助查明問題。但答案不會強制這個查詢使用seek。

+1

準確地說,完整的掃描比較經常地搜索(範圍),因爲掃描不需要查找+1 – Andomar

+0

以下是我的想法....對於tbl_transaction中的每一行,它都會掃描tbl_transaction_hsbc上的索引要加入的行。我在想,如果它是一個搜索,那麼每次查找要加入的行時都不需要掃描整個索引 - 它可以更快地查找它。我想我不明白這些機制...... –

+1

如果它執行掃描,它根本不需要做任何查找 - 數據已經在它正在掃描的頁面上。它不會掃描每一行的整個索引,它會掃描整個索引ONCE。 –

0

沒有索引查找,因爲您沒有where子句。 索引查找意味着您檢查索引中的一系列值。 由於您沒有where子句,除了掃描所有索引值外別無選擇。 所以名稱「索引掃描」。

這不是一個表掃描,它是一個索引掃描。如果您在其中一個表中沒有此列的索引,則您將有第二個表的表掃描+第一個表的索引掃描。