【发布时间】:2017-04-28 21:32:15
【问题描述】:
在向表中插入 200 万行时,我需要帮助。我插入的表有 40 亿行,我插入的表有 200 万行。插入速率约为每分钟 190 行。
DECLARE @BatchSize INT = 5000
WHILE 1 = 1
BEGIN
INSERT INTO [dbo].[a] ([a].[col1], [a].[col2], [a].[adate], [a].[importdate])
SELECT TOP(@BatchSize)
b.col1,
b.col2,
b.adate,
b.importdate
FROM
b
WHERE
NOT EXISTS (SELECT 1
FROM dbo.[a]
WHERE [a].col1 = b.col1
AND [a].col2 = b.col2
AND [a].adate = b.adate)
--AND [sent].aDate > getdate()-10)
IF @@ROWCOUNT < @BatchSize BREAK
END;
在上面的查询中,在表a中,col1和col2和col3是主键(Non-clustered)。我想从表 b 中插入表 a 中的每条记录...
表 a 有 3 个索引,一个是 col1.col2,第二个是 col1,col2,col3,第三个是 col1 ......
任何人都可以提供任何关于使其更快的想法吗?
我在 SQL Server 2008 R2 上有 128 Gb RAM。
谢谢
【问题讨论】:
-
我想你想要的是 MERGE()
-
两百万行,我会一批插入。
-
桌上有触发器吗?如果主键是 col1+col2+col3 你不能插入 dups 所以你不需要 not exists 子句。继续选择要插入的前 5000 行。我不明白 M. Ali 的建议。这将创建一个非常大的交易。
-
一个包含大量行和插入(以及删除/更新)的非聚集表最终会产生“无数”前向指针(非常低效的索引),这可能是问题所在。
-
嗨@benjamin 我试过不存在,它给了我重复键无法插入的错误......有什么想法可以克服吗?
标签: sql-server tsql ssms sql-insert