Sql 按VS划分的比较组
假设一个表Sql 按VS划分的比较组,sql,oracle,database-performance,Sql,Oracle,Database Performance,假设一个表CAR有两列CAR\u ID(int)和VERSION(int) 我想检索每辆车的最大版本 因此,有两种解决方案(至少): 或: 这两个查询的性能类似吗?是,它可能会影响 第二个查询是内联视图的一个示例。 这是一种非常有用的方法,用于执行具有各种计数类型的报告或使用任何聚合函数 Oracle执行子查询,然后将结果行用作FROM子句中的视图 当我们考虑性能时,总是推荐内联视图,而不是选择另一个子查询类型。 还有一件事,第二个查询将提供所有max记录,而第一个查询将只提供一条max记录 这
CAR
有两列CAR\u ID(int)
和VERSION(int)
我想检索每辆车的最大版本
因此,有两种解决方案(至少):
或:
这两个查询的性能类似吗?是,它可能会影响
第二个查询是内联视图的一个示例。
这是一种非常有用的方法,用于执行具有各种计数类型的报告或使用任何聚合函数
Oracle执行子查询,然后将结果行用作FROM子句中的视图
当我们考虑性能时,总是推荐内联视图,而不是选择另一个子查询类型。
还有一件事,第二个查询将提供所有max记录,而第一个查询将只提供一条max记录
这将取决于您的索引方案和表中的数据量。优化器可能会根据表中的实际数据做出不同的决策 我发现,至少在SQL Server(我知道您询问过Oracle)中,优化器更有可能对按查询划分的分区执行完全扫描,而不是按查询分组。但这只是在索引中包含汽车ID和版本(DESC)的情况下
这个故事的寓意是,我会进行彻底的测试,以选择正确的一个。对于小桌子来说,这无关紧要。对于非常非常大的数据集,两者都不可能很快……我知道这非常古老,但我认为应该指出这一点
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
我不知道你为什么选择第二种方式。。。在这种情况下,子选择理论上应该较慢,因为您从同一个表2x中选择,然后将结果连接回自身
只需从内联视图中删除版本,它们是一样的
select car_id, max(version) over (partition by car_id) as max_version
from car
在这种情况下,性能确实取决于优化器,但是是的,正如最初的答案所建议的那样,内联视图会产生狭窄的结果。虽然这不是一个很好的例子,因为它是同一个表,在给定的选择中没有过滤器
当您选择许多列,但需要适合结果集的不同聚合时,分区也很有用。否则,您将被迫按其他列分组 “还有一件事,第二个查询将提供所有max记录,而第一个查询将只提供一条max记录”。我不明白你为什么写第一列只返回一个max。两个查询返回相同的结果
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
select car_id, max(version) over (partition by car_id) as max_version
from car