Sql 使用非嵌套查询中的删除逻辑实现最快性能

Sql 使用非嵌套查询中的删除逻辑实现最快性能,sql,sql-server,sql-server-2008,tsql,sql-delete,Sql,Sql Server,Sql Server 2008,Tsql,Sql Delete,我正在尝试获取此删除(和选择)查询的最快性能。是否有更好的方法来删除记录,因为这需要10分钟以上的时间来运行?我想它必须自己进行排序和合并,直到找到记录 SELECT COUNT([VISIT_ID]) FROM [dbo].[I2B2_SRC_VISITS] WHERE [PATIENT_ID] NOT IN ( SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT] ) DELETE FROM [dbo].[I2B2_SRC_VISITS

我正在尝试获取此删除(和选择)查询的最快性能。是否有更好的方法来删除记录,因为这需要10分钟以上的时间来运行?我想它必须自己进行排序和合并,直到找到记录

SELECT COUNT([VISIT_ID])
FROM [dbo].[I2B2_SRC_VISITS]
WHERE [PATIENT_ID] NOT IN (
    SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT]
)

DELETE FROM [dbo].[I2B2_SRC_VISITS]
WHERE [PATIENT_ID] NOT IN (
    SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT]
)
编辑:我不能像选择一样将删除放在该查询前面。但这是DELETE语句的最终结果

DELETE FROM [dbo].[I2B2_SRC_VISITS]
WHERE [VISIT_ID] IN
(
    SELECT a.[VISIT_ID]
    FROM    [dbo].[I2B2_SRC_VISITS] a
            LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b
                ON a.[PATIENT_ID] = b.[PATIENT_ID]
    WHERE b.[PATIENT_ID]  IS NULL
)

如何通过
JOIN

DELETE  a
FROM    [dbo].[I2B2_SRC_VISITS] a
        LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b
            ON a.[PATIENT_ID] = b.[PATIENT_ID]
WHERE   b.[PATIENT_ID] IS NULL
确保两个表中的列
[PATIENT\u ID]
上都有键define,这会使操作更快


对<代码>不存在更好

DELETE  a 
FROM    [dbo].[I2B2_SRC_VISITS] a 
WHERE   NOT EXISTS
        ( 
            SELECT  1 
            FROM    [dbo].[I2B2_SRC_PATIENT] b
            WHERE   a.[PATIENT_ID] = b.[PATIENT_ID] 
        )

还可以使用
NOT EXIST
DELETE a FROM[dbo].[I2B2_SRC_visions]a WHERE NOT EXIST(从[dbo].[I2B2_SRC_PATIENT]b中选择1.[PATIENT_ID]=b.[PATIENT_ID])
可能没有足够的行到达临界点。看@JW你确定他们是同一个计划吗?我看到一个额外的TOP操作符,它不存在,并且有一个反半联接。另一个保留了外部连接,看起来它具体化了行并随后进行了筛选。请检查我对这个问题的评论中的第一个链接。@AaronBertrand right。就在这里<代码>不存在最好是@JW提示。对于这样的两个查询,尽管查询优化器抛出了所有的错误和谎言,但您可以通过将其作为单个批次来查看它们的相对估计成本,例如。(单个)计划显示了这两个查询,并且成本现在更易于比较。还有许多其他的网络文学将引导你走向你已经写过的不存在/不存在。但是,总会有例外,例如当您没有必要的索引时(有时可能是有效的)。总是尝试尽可能多的形式,并使用效果好的形式。不过,对于小型数据集来说,这可能并不重要。