比较组按 VS 过分区按

Mik*_*378 5 sql oracle database-performance

假设一张表CAR有两列CAR_ID (int)VERSION (int).

我想检索每辆车的最大版本。

所以有两种解决方案(至少):

select car_id, max(version) as max_version 
  from car  
 group by car_id;
Run Code Online (Sandbox Code Playgroud)

或者 :

select car_id, max_version 
  from  ( select car_id, version
               , max(version) over (partition by car_id) as max_version
            from car
                ) max_ver  
 where max_ver.version = max_ver.max_version
Run Code Online (Sandbox Code Playgroud)

这两个查询的性能相似吗?

Jus*_*ave 6

我知道这是非常古老的,但认为应该指出。

select car_id, max_version 
  from (select car_id
             , version
             , max(version) over (partition by car_id) as max_version
          from car ) max_ver  
 where max_ver.version = max_ver.max_version
Run Code Online (Sandbox Code Playgroud)

不知道为什么你这样做选择二...在这种情况下,子选择理论上应该更慢,因为你从同一个表中选择 2x,然后将结果连接回自身。

只需从内联视图中删除版本,它们就是同一件事。

select car_id, max(version) over (partition by car_id) as max_version
  from car
Run Code Online (Sandbox Code Playgroud)

在这种情况下,性能实际上取决于优化器,但是,是的,原始答案建议内联视图,因为它们会缩小结果。尽管这不是一个很好的例子,因为它的同一个表在给定的选择中没有过滤器。

当您选择大量列但需要适合结果集的不同聚合时,分区也很有用。否则,您将被迫按每隔一列进行分组。


Jav*_*ava 3

是的,可能会影响

第二个查询是内联视图的示例。这是一种非常有用的方法,用于执行具有各种类型计数的报告或使用任何聚合函数。

Oracle 执行子查询,然后使用结果行作为 FROM 子句中的视图。

当我们考虑性能时,始终推荐内联视图而不是选择其他子查询类型。

还有一件事是,第二个查询将给出所有最大记录,而第一个查询将只给出一个最大记录。

看这里

  • “还有一件事,第二个查询将给出所有最大记录,而第一个查询将只给出一个最大记录”。我不明白你为什么写第一列只返回一个最大值。两个查询返回相同的结果 (3认同)