1

我有一个临时表,它作为预定批处理脚本的一部分进行更新。

让我们将此表称为 Staging_Table

现在,我每天都会使用 Staging_Table 中的条目更新一个名为 Product_Table 的表格。我需要删除 Products_Table 中没有 Staging 表中的条目的行。

现在为了简化事情,暂存表包含大约 97000 条记录,而产品表只有 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 )
4

3 回答 3

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 
于 2014-12-22T12:28:33.847 回答
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);
于 2014-12-22T12:28:47.423 回答
0

对于这些繁重的数据,您必须使用 LEFT JOIN,而另一件事 'IN/NOT IN' 将使您的查询执行起来非常繁重,并且运行时间会更长。使用 join 会给你更快的执行速度。在你的情况下使用左连接

于 2014-12-22T12:37:36.027 回答