当前位置: 首页 > 面试题库 >

将GROUP BY与MAX()用作聚合vs ROW_NUMBER优于分区by,在性能上有区别吗?

姜奇
2023-03-14
问题内容

以下两个查询之间是否存在性能差异?如果是,那么哪个更好?:

    select 
    q.id, 
    q.name 
    from(
        select id, name, row_number over (partition by name order by id desc) as row_num
from table
    ) q
        where q.row_num = 1

相对

select
max(id) ,
name
from table
group by name

(结果集应该相同)

这是假设没有设置索引。

更新:我对此进行了测试,并且group by速度更快。


问题答案:

分组依据应该更快。行号必须为表中的所有行分配一行。它会在过滤掉不需要的内容之前执行此操作。

到目前为止,第二个查询是更好的结构。首先,必须确保partition子句中的列与所需的列匹配。更重要的是,“分组依据”是SQL中一个易于理解的构造。我还要推测,group
by可能会更好地利用索引,但这只是推测。



 类似资料:
  • 我有两个查询,其中一个涉及查询中的分区表,而另一个查询是相同的,只是涉及未分区的等效表。原始(非分区表)查询的性能优于分区的计数器。我不知道如何孤立这个问题。查看执行计划,我发现使用的索引与两个查询的B/W相同,新查询在其执行计划中显示了分区范围子句,这意味着正在进行分区剪枝。查询的形式如下:- 其中partTabA是分区表,partTabA.column1是分区键(范围分区)。在原始查询中,它将

  • 我理解聚合和组合之间的区别,但我在联想方面有点挣扎。我目前的理解是,当“它们相互使用”时,类之间存在关联,例如,在方法调用期间将一个对象传递给另一个对象。另请参阅: http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit 这两个对象都是独立存在的,和聚合不同,任何对象

  • 我正在尝试开发一个ElasticSearch聚合查询,它根据嵌套对象中的属性执行结果的组合。 将为索引设置相应的映射。 我需要的查询如下所示: 查询需要按嵌套属性的名称分组,但从根对象的bin属性分组,这似乎在ElasticSearch中引起了一些麻烦。 当尝试进行以下预固化时: 此上下文似乎不允许基于产品对象的根对项目进行装箱。 ManufacturerName中指定的ManufacturerN

  • 本文向大家介绍Java中关联与聚合之间的区别,包括了Java中关联与聚合之间的区别的使用技巧和注意事项,需要的朋友参考一下 协会 就对象而言,关联是指两个相关对象之间的“具有”关系。例如,一个雇员有一个通讯地址。 聚合 就对象而言,聚合是指两个相关对象之间具有“ +”关系。例如,一个部门有多名员工。它指的是在父类中具有子对象的集合。例如: 序号 键 协会 聚合 1 定义 关联是指彼此使用的两个类之

  • 在调试和故障处理的时候,我们通常有必要知道 RDD 有多少个分区。这里有几个方法可以找到这些信息: 使用 UI 查看在分区上执行的任务数 当 stage 执行的时候,你可以在 Spark UI 上看到这个 stage 上的分区数。 下面的例子中的简单任务在 4 个分区上创建了共 100 个元素的 RDD ,然后在这些元素被收集到 driver 之前分发一个 map 任务: scala> val s