2014-12-22 37 views
1

我有一个临时表,作为计划批处理脚本的一部分进行更新。如何获取不在另一个表中的表的记录?

让我们把这个表Staging_Table

现在每天我从Staging_Table条目更新提出呼吁Product_Table上。 我需要删除Products_Table中没有登台表项的行。

现在,暂存表暂存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) 
+0

临时表有任何索引? – SMA

回答

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); 
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 
0

对于这些大量的数据,你必须使用LEFT JOIN,和其他的事情“IN/NOT IN”会让你查询这么重来执行和运行时间会更多。加入的使用会让你更快执行。在你的情况下使用左连接

相关问题