gpt4 book ai didi

mysql - 高效地选择每第 n 行,无需 ROW_NUMBER

转载 作者:行者123 更新时间:2023-11-29 20:49:25 25 4
gpt4 key购买 nike

我有一个包含约 2000 万行的表,总计约 2 GB。我需要选择每第 n 行,只剩下几百行。但我一生都无法弄清楚如何在不超时的情况下做到这一点。

ROW_NUMBER 不可用,并且使用变量(例如 @row)跟踪当前行号会导致超时。我认为这是因为它仍在迭代每一行,但我不太确定。也没有整数索引可供我使用。而是使用 DATETIME 字段。这是使用 @row 的示例查询:

SET @row = 0;
SELECT `field` FROM `table` WHERE (@row := @row + 1) % 1555200 = 0;

还有什么我没有尝试过的吗?

提前致谢!

最佳答案

这确实是一个棘手的问题。您可以计算出最小日期,然后使用 datediff 来获取顺序值,但这可能不可控制(如下所示)。对我来说,在具有 1600 万行的表上花费了 18 秒,但您的里程可能会有所不同。

** 编辑 ** 我还应该补充一点,这是针对包含日期列的索引进行非聚集索引扫描(很确定这是由日期周围的函数强制的,但也许有更多知识的人可以对此进行扩展) )。针对该列创建索引后,我有 12 秒的时间。

尝试一下并让我知道效果如何:)

DECLARE @n INT = 5;

SELECT
DATEDIFF(DAY, first_date.min_date, DATE_COLUMN) AS ROWNUM
FROM
ss.YOUR_TABLE
OUTER APPLY
( SELECT
MIN(a.DATE_COLUMN) min_date
FROM ss.YOUR_TABLE a
) first_date
WHERE DATEDIFF(DAY, first_date.min_date, DATE_COLUMN) % @n = 0

再次编辑:

刚刚注意到这已被接受为答案...万一其他人遇到这个问题,它可能不应该。经审查,只有当您的日期时间字段每天有一个条目并且日期时间是连续的(即以与日期时间相同的顺序添加行,或者如果日期时间是主键)时,这才有效。

同样,仅适用于每天,但有上述注意事项,如果您每单位时间添加一行,您可以更改日期差异以使用任何单位(月、年、分钟等)。

关于mysql - 高效地选择每第 n 行,无需 ROW_NUMBER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181020/

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