1

我目前正在对客户的 MSSQL Server 进行分析。我已经修复了许多问题(不必要的索引、索引碎片、NEWID()被用于整个商店的身份等),但我遇到了以前从未见过的特定情况。

进程 1 将数据导入临时表,然后进程 2 使用INSERT INTO. 第一个过程非常快(它使用BULK INSERT),但第二个过程大约需要 30 分钟才能执行。流程2中的“问题”SQL如下:

INSERT INTO ProductionTable(field1,field2)
SELECT field1, field2
FROM SourceHeapTable (nolock)

上面的 INSERT 语句将数十万条记录插入到 ProductionTable 中,每行分配一个UNIQUEIDENTIFIER,并插入到大约 5 个不同的索引中。我很欣赏这个过程需要很长时间,所以我的问题是:在进行此导入时,第三个过程负责在 ProductionTable 上执行持续查找 - 除了将附加记录插入到表中之外:

INSERT INTO ProductionTable(fields...)
VALUES(values...)

SELECT *
FROM ProductionTable (nolock)
WHERE ID = @Id

对于上述INSERT...SELECT发生的 30 分钟左右,INSERT INTO超时。

我的直接想法是 SQL 服务器在INSERT...SELECT. 在我的分析过程中,我在服务器上做了很多分析,并且在INSERT...SELECT.

从来不需要同时将来自两个来源的记录插入表中 - 至少在 ETL 过程中 - 我不知道如何处理这个问题。我一直在查找INSERT表格提示,但大多数在未来的版本中都已过时。

在我看来,这CURSOR是去这里的唯一途径吗?

4

2 回答 2

2

您可以考虑 BULK INSERT for Process-2 将数据放入 ProductionTable。

另一种选择是将 Process-2 批处理成大约 1000 条记录的小批量,并使用表值参数进行插入。请参阅:http: //msdn.microsoft.com/en-us/library/bb510489.aspx#BulkInsert

于 2013-06-18T09:02:47.023 回答
0

好像是表锁。

尝试在 ETL 过程中插入部分。就像是

while 1=1
begin

   INSERT INTO ProductionTable(field1,field2)
   SELECT top (1000) field1, field2
   FROM SourceHeapTable sht (nolock)
   where not exists (select 1 from ProductionTable pt where pt.id = sht.id)

   -- optional
   --waitfor delay '00:00:01.0'

   if @@rowcount = 0 
      break;

end
于 2013-06-18T09:11:12.183 回答