我想知道ROW_NUMBER()的性能: 在我的测试用例中,我有许多元素,每个元素中有大量(~100k)条目。我想为每个元素选择第一个条目:
SELECT * FROM(
SELECT
element, msg, timestamp,
ROW_NUMBER() OVER(PARTITION BY element ORDER BY timestamp) as rank
FROM table
) t1
WHERE rank = 1
对于我来说,为了保留第一个分区而需要为每个分区订购所有100k行似乎太过分了。类似于MIN()函数的东西应该天真地表现得更好。 所以我试过这样的事情:
SELECT
element, MIN(a)[0] as timestamp, MIN(a)[1] as msg
FROM(
SELECT element, ARRAY(timestamp, msg) as a
FROM table
) t1
GROUP BY partition
但是当比较两种方法的CPU使用率时,我的性能相同。 ROW_NUMBER()优化器是否比我想象的要聪明,还是我错过了什么?
编辑:我的原始查询中有错误。现在看一下结果,看起来MIN(ARRAY)方法比ROW_NUMBER()过滤器相当快。是否有更简单的规范方法来实现FIRST_ROW OVER(PARTITION)过滤器,而无需定义大规模数组然后解构它?
答案 0 :(得分:-1)
你错过了什么。 GROUP BY
需要做很多工作 - 看似与ROW_NUMBER()
类似。
我并不熟悉Hive的底层机制。在大多数数据库中,ROW_NUMBER()
将获取行的物理标识符,各种键,并单独对它们进行排序。然后,使用物理标识符,可以将值快速添加回原始数据。当然,细节可能因数据库而异,但这是一般的想法。
Hive可能不会这样做。但是,无论它做什么,在努力方面都与GROUP BY
类似。