2012-04-27 119 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