更快的 SQL DELETE WHERE IN/EXISTS 需要

Tys*_*Tys 1 sql t-sql sql-server

我有一个表变量,用于从多个表中收集记录,这些记录必须稍后在查询中进行处理。

它看起来有点像这样:

DECLARE @Prices TABLE ( 
  ProductId INT, 
  Price MONEY,
  Fee INT, 
  Discount INT,
  IsSpecialPrice BIT
)
Run Code Online (Sandbox Code Playgroud)

现在,在从几个表(大约 400K 记录)收集价格相关记录后,我必须删除一些记录。对于我至少有 2 条记录的产品(一条或多条 IsSpecialPrice = 0 和一条 IsSpecialPrice = 1),我必须删除 IsSpecialPrice = 0 的所有记录。

现在使用 DELETE WHERE IN 或 DELETE WHERE EXISTS 需要很长时间才能删除很少的记录。所以,我在这里寻找更快的查询类型。

现在这就是我使用的:

DELETE P1
FROM @Prices P1
WHERE P1.IsSpecialPrice = 0 AND EXISTS (SELECT P2.ProductId FROM @Prices P2 WHERE P2.ProductId = P1.ProductId AND P2.IsSpecialPrice = 1)
Run Code Online (Sandbox Code Playgroud)

我尝试了 WHERE IN 和 WHERE EXISTS,但两者都一样慢。

Pao*_*olo 5

加入怎么样?

DELETE P1
FROM @Prices P1 join (
  SELECT DISTINCT ProductId
  FROM @Prices 
  WHERE IsSpecialPrice = 1
) P2 on P1.ProductId = P2.ProductId
WHERE P1.IsSpecialPrice = 0
Run Code Online (Sandbox Code Playgroud)

我在一个有 500k 行的表上做了一个测试,并在 2 秒内完成了删除 90k 行,这与永无止境的相比是一个巨大的进步exists