我有一个包含大约2000万行的表,总共大约2 GB。我需要选择每一行,只留下几百行。但我不能为我的生活找出如何做到这一点而不会超时。
ROW_NUMBER
不可用,并且使用变量(例如@row
)跟踪当前行号会导致超时。我认为这是因为它仍在迭代每一行,但我不太确定。我也没有使用整数索引。而是使用DATETIME
字段。这是使用@row
的示例查询:
SET @row = 0;
SELECT `field` FROM `table` WHERE (@row := @row + 1) % 1555200 = 0;
还有什么我没试过的吗?
提前致谢!
答案 0 :(得分:0)
这肯定是一个棘手的问题。您可以计算出最小日期,然后使用datediff来获取顺序值,但这可能不是sargeable(如下所示)。对我来说,在一张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
再次编辑:
刚刚注意到这已经被接受为答案......如果有其他人遇到这个,它可能不应该。在审核时,这仅适用于您的日期时间字段每天有一个条目且日期时间是连续的(以与日期时间相同的顺序添加行,或者如果日期时间是主键)。
如果每天单位时间内添加一行,则可以每天只使用上述注意事项,更改日期差异以使用任何单位(月,年,分等)。