Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按VS划分的比较组_Sql_Oracle_Database Performance - Fatal编程技术网

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