2013-05-30 75 views
0

我有兩個表A和B.這些表通過A.bid = B.id.鏈接。表A有19列,表B有10列。兩張表都包含大約40,000條記錄。SQL投影成本

我一直在尋找在以下3個簡單的查詢:

-- Query 1 
SELECT Col1, Col2, Col3, Col4, Col5 FROM A, B 
WHERE A.bid = B.id 

-- Query 2 
SELECT * FROM A 

-- Query 3 
SELECT Col1 FROM A 

我發現有趣的是,查詢2採用目前爲止最長的運行,接着是查詢1(加入)並以最快的被查詢3(一個更嚴格的預測)。所有3個查詢返回相同的行數。

是什麼導致了這種行爲?爲什麼投影中的列數對性能有如此大的影響?當然,我明白投影並不是免費的,但我不明白加入的方式(儘管投影更加有限)可以比簡單的SELECT *運行更快(速度更快)。

謝謝。

回答

1

您必須記住,使用SELECT *會返回表中的所有列。

這意味着數據庫引擎需要讀取所有列和所有行,這在您的表A的情況下更多。此外,這些數據需要轉移。所以可能還有很多網絡流量。

在SQL Server中,例如,您可以創建包含列的索引(與索引一起存儲但不影響索引本身的列)。

這使您可以指定在您的選擇中您將使用的索引中包含的列。不是實際的連接或過濾列,而是顯示或計算中使用的附加列。

現在,如果你有一個表,讓說TABLE_AA-Z列,在A,B,C列的索引與包括列D,E,F

查詢

SELECT A,B,C,D,E,F 
FROM TABLE_A 
WHERE A = ?A 
AND B = ?B 
AND C = ?C 

將能夠使用這樣的指數。

現在,如果你運行該查詢

SELECT * 
FROM TABLE_A 
WHERE A = ?A 
AND B = ?B 
AND C = ?C 

查詢引擎將能夠輕鬆地識別有問題的行,但仍然需要做一個查詢檢索不包含在索引中的列。

+0

我想我估計額外的讀取/網絡流量的成本。我非常關注聯盟中關鍵比較的成本,以致我看到了這些額外成本。謝謝。 –

0

這很正常,因爲Sql引擎正在取所有19列進行選擇,即使沒有在條件中使用,在Query 1中你只有7列和條件來進行。