使用 while 循环将 SQL 表拆分为块 [已关闭]

split sql table into chunks using while loop [closed]

提问人:frank 提问时间:11/16/2023 更新时间:11/16/2023 访问量:51

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

6天前关闭。

我继承了一个 2T 行、1.4TB 的表,该表需要很长时间才能查询。

我想根据行标识符的值将其拆分为 20 * 100m 块表。

我可以写 20 次:

select * 
into smallTable1
from bigTable
where rowID < 100 000 000

更改 and 范围,但是有没有办法用 或更优雅的东西来做到这一点?smallTablerowIDwhile loop

sql-服务器

评论

1赞 Stu 11/16/2023
你试过什么吗?大概这是一次性操作,只运行几个语句并收工有什么问题?
0赞 frank 11/16/2023
是的,1 次操作。只是想让它看起来时尚酷炫
1赞 Mark Schultheiss 11/16/2023
这感觉就像是数据的根设计存在问题,其中有这么大的单行。(除了所呈现代码中的语法错误)
2赞 siggemannen 11/16/2023
为什么不对表进行分区
2赞 P.Salmon 11/16/2023
如果您确实拆分为 20 个较小的表,您如何想象这会提高您的查询性能 - 而不是 1 个表进行分析,现在您有很多表,并且找到特定行也会很麻烦。再多一点理由可能会有所帮助。

答:

0赞 Tim Biegeleisen 11/16/2023 #1

您可以在此处应用 and 分区。例如,要查找第一个 100m 块,可以使用:ROW_NUMBERrowID

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY rowID) rn
    FROM bigTable
)

SELECT col1, col2, col3, ...  -- list out all columns explicitly 
INTO smallTable1
FROM cte
WHERE rn <= 100000000;

评论

0赞 Charlieface 11/16/2023
这将扫描整个表格。为什么不直接使用?TOP...ORDER BY
0赞 Tim Biegeleisen 11/16/2023
就目前而言,我的答案是合理的,因为我们不知道何时/多久需要每个块。此外,我怀疑这个要求是针对生产的,所以性能不是主要问题。