2016-02-29 35 views
1

我有一個DISTINCT子句刪除重複的值。 如果有多個表達式,性能如何? 例如:DISTINCT是否使用多個表達式執行全表掃描?

SELECT DISTINCT city, state 
FROM customers 
WHERE total_orders > 10 
ORDER BY city; 

這會執行全表掃描嗎?

+0

不知道桌上的索引是什麼....誰知道? –

+0

我沒有指定。 沒有索引。 (僅針對客戶中的Id) –

+0

這與Oracle的編程語言PL/SQL無關。我將刪除該標籤。 –

回答

2

DBMS在認爲合適時執行全表掃描。

在您的示例中,當DBMS認爲使用total_orders > 10時,它只會得到很少的行,並且該列上有索引,它將使用該索引訪問表記錄。在第二步中,它將應用DISTINCT,然後進行排序(或在使行不同時進行即時排序)。如果DBMS認爲它會得到太多的記錄total_orders > 10它可能會決定進行全表掃描。 (然後應用DISTINCTORDER BY)。所以無論如何,DISTINCT不會改變任何東西。

如果你有total_orders + City + state索引,數據庫管理系統可以決定完全不訪問表,因爲在索引,甚至在需要的順序存在的所有數據。但是,DBMS不會使用DISTINCT

如果你有上state + total_ordersCity +的索引(即錯誤的順序;所述WHERE子句不能直接應用)時,可能DBMS仍然決定只讀取索引,但它是不太可能。再說一遍:DBMS在沒有DISTINCT的情況下也會這樣做。

如果你沒有索引,DBMS必須做一個全表掃描,當然,因爲沒有索引來規避它。那麼,我想這是不用說的:-)

1

這會執行全表掃描嗎?

檢查解釋計劃

EXPLAIN PLAN FOR your_query; 
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 

這是達優化決定爲執行查詢的最佳計劃。既然你沒有一個指數上的過濾謂詞使用的列,它具有比FTS沒有其他選擇(˚F ULL 牛逼能夠小號即可)。