哪种方式可以更快地删除 sql 中的重复行?
Which way is faster to delete duplicate rows in sql?
我需要在超过 400 万条记录的 table 中查找并删除重复行。我想知道从速度的角度来看哪种方式最好。看了这篇文章,里面给出了几种解决方案,包括使用GROUP BY,PARTITION BY。但是没有解释哪个更快最有效。
我的 table 有 23 列(不同的数据类型),没有 Primary KEY 也没有 FOREIGN KEYS 但我想知道通常是否有更好的方法来做到这一点。
文章可见here.
不了解您的 table 结构,因此无法给您准确的答案。
但是,为什么不尝试一些方法并将 DELETE
替换为 SELECT
来对它们进行基准测试呢?
我喜欢使用像这样简单的东西,但是我的 table 只包含大约 50000 行,所以我没有任何性能问题
select * from tblTruckCost
--DELETE FROM tblTruckCost
WHERE tblTruckCost.TruckCostID NOT IN
(
SELECT MIN(c.TruckCostID)
FROM tblTruckCost c
GROUP BY c.DossierNumber, c.SequenceNumber, c.InvoiceNumber
)
group by用于获取双打
table 没有主键通常是个坏主意。这是删除重复项的一种方法,每 23 列保留的记录是任意的:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, ..., col22, col23
ORDER BY (SELECT NULL)) rn
FROM yourTable
)
DELETE
FROM cte
WHERE rn > 1;
我需要在超过 400 万条记录的 table 中查找并删除重复行。我想知道从速度的角度来看哪种方式最好。看了这篇文章,里面给出了几种解决方案,包括使用GROUP BY,PARTITION BY。但是没有解释哪个更快最有效。
我的 table 有 23 列(不同的数据类型),没有 Primary KEY 也没有 FOREIGN KEYS 但我想知道通常是否有更好的方法来做到这一点。
文章可见here.
不了解您的 table 结构,因此无法给您准确的答案。
但是,为什么不尝试一些方法并将 DELETE
替换为 SELECT
来对它们进行基准测试呢?
我喜欢使用像这样简单的东西,但是我的 table 只包含大约 50000 行,所以我没有任何性能问题
select * from tblTruckCost
--DELETE FROM tblTruckCost
WHERE tblTruckCost.TruckCostID NOT IN
(
SELECT MIN(c.TruckCostID)
FROM tblTruckCost c
GROUP BY c.DossierNumber, c.SequenceNumber, c.InvoiceNumber
)
group by用于获取双打
table 没有主键通常是个坏主意。这是删除重复项的一种方法,每 23 列保留的记录是任意的:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, ..., col22, col23
ORDER BY (SELECT NULL)) rn
FROM yourTable
)
DELETE
FROM cte
WHERE rn > 1;