2012-10-03 57 views
3

我很難弄清楚爲什麼特定的執行計劃是在一種情況下強制執行的,而不是在另一種情況下。例如:SQL Server - 與group by的集合比沒有集合的集合更快

select min(COLUMN) from TABLE where FK_COLUMN = 1; 

select min(COLUMN) from TABLE where FK_COLUMN = 1 group by FK_COLUMN; 

第一產生的執行計劃與索引掃描,而在第二掃描被替換爲尋求。進一步增加我的困惑是事實上,這不會發生在桌子上的每一列 - 對於一些列,我不需要爲了搜索而製作組。我還注意到,緩慢條件只對某些外鍵值發生 - 那些只返回沒有行,但不是所有返回沒有行的值都會產生不利的計劃。是什麼賦予了?

+0

什麼索引在你的表上? –

+0

主鍵上的單個聚集索引。 – GhostOfPerdition

+0

更詳細請(列 - 索引)。什麼數量的指標 –

回答

1

我以@Robbie Dee作爲Oracle CBO選擇的執行計劃並不意味着它是最好的方式,但在大多數情況下是最優化的方式。 此外,執行計劃可以根據列和行的存儲方式(基本上是表的大小)進行更改。

考慮在EMP_ID列上主鍵的EMP表。如果我們在搜索中包含主鍵列,我們會期望INDEX RANGE SCAN,但我們可能會在解釋計劃中獲得FULL TABLE ACCESS。這是由Oracle CBO選擇的數據訪問路徑,因爲它知道表的大小太小,不需要根據主鍵進行搜索。

Hth ...