【问题标题】:How do I get a records for a table that do not exist in another table?如何获取另一个表中不存在的表的记录?
【发布时间】:2014-12-22 12:23:55
【问题描述】:

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

让我们将此表称为 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 )

【问题讨论】:

  • 暂存表有索引吗?

标签: sql select subquery sql-delete notin


【解决方案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】:

    使用 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 
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 2014-02-21
        • 2010-12-31
        • 1970-01-01
        • 2012-08-12
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多