2012-08-02 22 views
1

所以想我有這個疑問:是有辦法加快查詢速度自我指涉

SELECT * FROM table1 A, table1 B where A.id = B.id; 

即使上表1 ID的索引,它仍然會掃描整個表...是有一種方法可以加快速度,使其不掃描整個表格?

+1

它正在掃描整個表格,因爲表格中的每條記錄都將符合條件。我認爲這是對你實際問題的簡化,但我認爲你太簡單了,它不再是一個很好的表示。 – invertedSpear 2012-08-02 21:01:43

+0

「即使table1上的id有索引,它仍然會掃描整個表...」---是的,因爲您從'table1'中選擇了所有內容。 「有沒有辦法加快速度,以便它不掃描整個表」---添加'WHERE' – zerkms 2012-08-02 21:01:48

+0

「id」是否爲NULL?這將是一個可以作爲過濾器的情況。 – 2012-08-02 21:15:01

回答

0

雖然我沒有執行計劃在我面前,但這實際上只是最可能的掃描TableA,原因是因爲您沒有TableA的其他條件。目前應該在TableB上尋找,因爲它是統計數據。現在,如果您要爲TableA提供另一個條件,並且該條件符合索引,則會發現它並未掃描整個表。

此外,如果TableA上的索引是查詢的覆蓋索引,它實際上甚至不會讀取TableA的數據頁面。

此外,如果在TableATableB之間存在外鍵約束,並且您沒有從ID字段讀TableB以外的任何東西,它也不會讀取數據頁。此外,即使您確實需要來自TableB的數據,如果該數據位於索引上,它仍然不需要讀取數據頁面。

但最後,因爲您選擇了*,所以這不太可能是一個非常有效的查詢,因爲它會從這兩個表中選擇所有列。

我希望這不是太長時間囉嗦,但我想確保你知道我來自哪裏。