【发布时间】:2019-08-28 03:06:06
【问题描述】:
我有一个存储过程,它收集来自各地的 ETL 数据,最后尝试将它们全部连接到一个大表中。大约 100 列宽,3500 万行。
当我从临时表中提取并将它们全部连接在一起时,插入查询可能需要数小时、页面到磁盘等。它对于我的环境来说太大了。
Insert Into tbl_huge
Select Distinct a, b, c, d, e, f, g, h, i, j, k
from (Mess of Subqueries & #tmp_tbls)
批处理此插入以一次提交 100k 行或其他内容的最佳方法是什么?数据中没有好的自然键可以将其分解成半均匀的,而且我担心无论如何这都是真的。
我已经看到使用目标表中不存在的地方的不同示例,但这似乎是错误的方法,不会继续扩展和增长。
那么这里最好的方法是什么?对结果进行排序并在 while 循环中多次重新执行 Select & insert 查询,保持计数器知道我需要执行 rows > x?
有没有更好的方法,要么允许我准确地选择要插入的子集,要么将选择预处理到内存中(+页面文件由于大小)并将其读回以插入块中?
【问题讨论】:
-
我首先要看的是您是否可以重新组织您的
(Mess of Subqueries & #tmp_tbls),从而消除对SELECT DISTINCT的需求。如果有什么导致你消耗资源,那就是它。 -
我的强烈建议是don’t use a stored procedure,而是使用您选择的应用程序语言在数据库外组装数据更改,然后一次发送 10K 行
标签: sql sql-server