我有一個DISTINCT子句刪除重複的值。 如果有多個表達式,性能如何? 例如:DISTINCT是否使用多個表達式執行全表掃描?
SELECT DISTINCT city, state
FROM customers
WHERE total_orders > 10
ORDER BY city;
這會執行全表掃描嗎?
我有一個DISTINCT子句刪除重複的值。 如果有多個表達式,性能如何? 例如:DISTINCT是否使用多個表達式執行全表掃描?
SELECT DISTINCT city, state
FROM customers
WHERE total_orders > 10
ORDER BY city;
這會執行全表掃描嗎?
DBMS在認爲合適時執行全表掃描。
在您的示例中,當DBMS認爲使用total_orders > 10
時,它只會得到很少的行,並且該列上有索引,它將使用該索引訪問表記錄。在第二步中,它將應用DISTINCT
,然後進行排序(或在使行不同時進行即時排序)。如果DBMS認爲它會得到太多的記錄total_orders > 10
它可能會決定進行全表掃描。 (然後應用DISTINCT
和ORDER BY
)。所以無論如何,DISTINCT
不會改變任何東西。
如果你有total_orders
+ City
+ state
索引,數據庫管理系統可以決定完全不訪問表,因爲在索引,甚至在需要的順序存在的所有數據。但是,DBMS不會使用DISTINCT
。
如果你有上state
+ total_orders
City
+的索引(即錯誤的順序;所述WHERE
子句不能直接應用)時,可能DBMS仍然決定只讀取索引,但它是不太可能。再說一遍:DBMS在沒有DISTINCT
的情況下也會這樣做。
如果你沒有索引,DBMS必須做一個全表掃描,當然,因爲沒有索引來規避它。那麼,我想這是不用說的:-)
這會執行全表掃描嗎?
檢查解釋計劃。
EXPLAIN PLAN FOR your_query;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
這是達優化決定爲執行查詢的最佳計劃。既然你沒有一個指數上的過濾謂詞使用的列,它具有比FTS沒有其他選擇(˚F ULL 牛逼能夠小號即可)。
不知道桌上的索引是什麼....誰知道? –
我沒有指定。 沒有索引。 (僅針對客戶中的Id) –
這與Oracle的編程語言PL/SQL無關。我將刪除該標籤。 –