CTE 要分块选择吗?

发布于 2024-10-06 15:43:22 字数 164 浏览 7 评论 0原文

我想使用 SQL Server 2008(递归?)CTE 在 4 亿行表中一次选择 100 万行。结果将被写到一个文本文件中,我很理解这个文件,但不理解 CTE 分块部分。

该表在 DateTime 列上具有良好的覆盖索引,但没有 PK。

有人有什么建议吗?

谢谢。

I would like to use a SQL Server 2008 (recursive?) CTE to select 1 million rows at a time of a 400 million row table. The results will be written out to a text file, which I grok but not the CTE chunking part.

The table has good covering indexes on a DateTime column but no PK.

Does anyone have any suggestions?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

人生戏 2024-10-13 15:43:22

您可以使用 ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY) 作为 PK_Key 窗口函数来创建伪 PK,但这不是最佳选择,因为将为每个选择对整个表进行排序。

更好的方法是根据已有的索引对语句进行分块,而不是精确地按 100 万行进行分块。也就是说,检查一些数据并选择一个任意限制来实现您想要的。如果一个月内大约有 100 万行,那么对于每个数据检索操作,都会获取一个月的数据。您甚至不需要 CTE,因为听起来您不是在处理递归数据结构。

You can create a psuedo PK by using the ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY <column>) as PK_Key windowing function but this will be suboptimal because the entire table will be ordered for each select.

A better way to do it is to chunk your statement by the indexes you have instead of on exactly 1m rows. That is, examine some of your data and pick an arbitrary limit which achieves what you want. If you have roughly 1m rows in a month, then for each data retrieval operation, get a months worth of data. You won't even need a CTE for it, as from the sounds of it you aren't dealing with recursive data structures.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文