我目前正在对客户的 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
是去这里的唯一途径吗?