2012-04-27 114 views
-1

在Oracle,下面的三個查詢中的哪一個最有效的:甲骨文:DISTINCT與GROUP BY與ROW_NUMBER

SELECT DISTINCT a, b 
FROM tab 

SELECT a, b 
FROM tab 
GROUP BY a, b 

SELECT a, b 
FROM 
(SELECT a, b, row_number() OVER (PARTITION BY a, b ORDER BY a, b) rn 
FROM tab) 
WHERE rn = 1 
+3

你能否執行計劃並查看每個計劃的成本? – mservidio 2012-04-27 20:25:39

+4

這取決於。如果一個人總是比別人好,那麼其他人就不會存在。我會說,如果我正在執行一些聚集函數('SUM','MIN','MAX'),我只使用'GROUP BY',並且除了最簡單的情況外,我都避免使用'DISTINCT',因爲比不是,開發人員說:「我收到了重複的行,但我不明白數據模型,所以我會在這裏打一個'DISTINCT'」,然後在路上,一些數據組合無效原始的隱含假設,並報告「突破」。 – Tebbe 2012-04-27 20:29:29

+4

P.S.在你的分析函數中,由於你已經是''PARTITION''''''''a''和'b',所以你永遠也不會有''ORDER BY''和/或'B'的機會: ORDER BY'子句本質上是無操作的。因此,無論'ORDER BY'是另一個(非''a',非'b')列,或者如果您不在意'ORDER BY NULL'。 – Tebbe 2012-04-27 20:32:25

回答

1

的第一個是正確的選擇,因爲其他人是古怪的和非標準的(和稍微不正當的)達到相同目標的方式。

+0

效率呢? – 2012-04-30 15:02:39

+0

也許1和2非常相似,第三個是最慢的。 – 2012-04-30 15:08:36