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)
这两个查询的性能相似吗?
我知道这是非常古老的,但认为应该指出。
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)
在这种情况下,性能实际上取决于优化器,但是,是的,原始答案建议内联视图,因为它们会缩小结果。尽管这不是一个很好的例子,因为它的同一个表在给定的选择中没有过滤器。
当您选择大量列但需要适合结果集的不同聚合时,分区也很有用。否则,您将被迫按每隔一列进行分组。
归档时间: |
|
查看次数: |
19083 次 |
最近记录: |