我有一个临时表,它作为计划批处理脚本的一部分进行更新。
让我们调用此表Staging_Table
现在我每天都会使用Staging_Table中的条目更新名为Product_Table的表格。 我需要删除Products_Table中没有Staging表条目的行。
现在为了解决问题,临时表保存了大约97000条记录,而producst表只有7000条。但是每天,临时表中的条目增加了97000.我有一个名为TDC_IDP_ID的产品密钥....
所以我有这个查询似乎永远需要执行......
DELETE FROM Product_Table
WHERE PRODUCT_TD_PARTCODE NOT IN ( SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID )
现在内部查询有97000条记录。我如何优化此查询(至少运行)还是有另一种方法可以解决这个问题?而不是选择我尝试了以下查询,它仍在运行,因为我键入此问题。它已经运行了11分钟......
SELECT COUNT(*)
FROM Product_Table
WHERE PRODUCT_TD_PARTCODE NOT IN ( SELECT TDC_TD_PARTCODE FROM Staging_Table WHERE TDC_IDP_ID = @TDC_IDP_ID )
答案 0 :(得分:1)
使用 LEFT JOIN 代替 NOT IN
试试这个:
SELECT COUNT(*)
FROM Product_Table PT
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID
WHERE ST.TDC_TD_PARTCODE IS NULL
DELETE PT
FROM Product_Table PT
LEFT OUTER JOIN Staging_Table ST ON PT.PRODUCT_TD_PARTCODE = ST.TDC_TD_PARTCODE AND ST.TDC_IDP_ID = @TDC_IDP_ID
WHERE ST.TDC_TD_PARTCODE IS NULL
答案 1 :(得分:1)
首先,将索引改为not exists
:
DELETE FROM Product_Table
WHERE NOT EXISTS (SELECT 1
FROM Staging_Table st
WHERE st.TDC_IDP_ID = @TDC_IDP_ID AND
st.TDC_TD_PARTCODE = product_table.PRODUCT_TD_PARTCODE
);
然后你想要一个登台表的索引:
create index idx_Staging_Table_2 on Staging_Table(TDC_TD_PARTCODE, TDC_IDP_ID);
答案 2 :(得分:0)
对于这些繁重的数据,你必须使用LEFT JOIN,而另一件事'IN / NOT IN'将使你查询如此繁重而且运行时间会更多。使用join将使您更快地执行。在您的情况下使用左连接