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,但两者都一样慢。
加入怎么样?
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。