我想看看是否有可能改进使用WHERE NOT EXISTS的以下查询?
我想将另一个表中的记录添加到500个批次中的新表中,其中键位于临时表中,但是如果可能的话,它可以提高性能。
WHILE 1 = 1
BEGIN
INSERT INTO newTable WITH (TABLOCK)
SELECT TOP(500) *
FROM srcTable src
WHERE NOT EXISTS (SELECT 1 FROM newTable WHERE pKey = src.pKey
AND src.pKey IN (SELECT pKey FROM #TempTable))
IF @@ROWCOUNT < 500 BREAK
END
谢谢!
答案 0 :(得分:0)
将这两个条件放在not exists
中似乎很奇怪。所以我在想:
INSERT INTO newTable WITH (TABLOCK)
SELECT TOP(500) *
FROM srcTable src
WHERE NOT EXISTS (SELECT 1 FROM newTable nt WHERE nt.pKey = src.pKey) AND
NOT EXISTS (SELECT 1 FROM #TempTable tt WHERE src.pKey = t.pkey);
然后,对于此查询,我希望newTable(pkey)
和#TempTable(pkey)
上的索引。
注意:我认为我的逻辑是正确的。将IN
放入相关NOT EXISTS
中的不相关表格会让人感到困惑。
编辑:
嗯。 。 。如果我的逻辑错误,那么你只需要EXISTS
第二个条件:
INSERT INTO newTable WITH (TABLOCK)
SELECT TOP(500) *
FROM srcTable src
WHERE NOT EXISTS (SELECT 1 FROM newTable nt WHERE nt.pKey = src.pKey) AND
EXISTS (SELECT 1 FROM #TempTable tt WHERE src.pKey = t.pkey);