gpt4 book ai didi

sql - 使用 row_number() 选择第一行

转载 作者:行者123 更新时间:2023-12-02 19:41:29 25 4
gpt4 key购买 nike

我想知道 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) 过滤器,而不必定义一个庞大的数组然后解构它?

最佳答案

你错过了一些东西。 GROUP BY需要做很多工作——看起来类似于 ROW_NUMBER() .

我对 Hive 的底层机制并不十分熟悉。在大多数数据库中,ROW_NUMBER()将获取行的物理标识符、各种键,并分别对它们进行排序。使用物理标识符,然后可以将值快速添加回原始数据。当然,细节可能因数据库而异,但这是一般的想法。

Hive 可能不会这样做。但是,无论它做什么都类似于 GROUP BY在努力方面。

关于sql - 使用 row_number() 选择第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44634847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com