任何人都可以幫我優化其中一個查詢,該查詢需要 20 多分鐘才能運行 300 萬條資料。
表結構
-----------------------------------------------------------------------------------------
|id [INT Auto Inc]| name_id (uuid) | name (varchar)| city (varchar) | name_type(varchar)|
-----------------------------------------------------------------------------------------
詢問
查詢的目的是消除重復,這里重復意味著具有相同name_id和name。
DELETE
FROM records
WHERE id NOT IN
(SELECT DISTINCT
ON (name_id, name) id
FROM records);
uj5u.com熱心網友回復:
我會使用存在邏輯撰寫您的洗掉:
DELETE
FROM records r1
WHERE EXISTS (SELECT 1 FROM records r2
WHERE r2.name_id = r1.name_id AND r2.name = r2.name AND
r2.id < r1.id);
此洗掉查詢將保留具有最小值的重復項id。為了加快速度,您可以嘗試添加以下索引:
CREATE INDEX idx ON records (name_id, name, id);
uj5u.com熱心網友回復:
您可能已經在標識列上有一個主鍵,然后您可以使用它通過以下方式按 id 排除冗余行:
WITH cte AS (
SELECT MIN(id) AS id FROM records GROUP BY name_id, name)
DELETE FROM records
WHERE NOT EXISTS (SELECT id FROM cte WHERE id=records.id)
即使沒有索引,這也應該相對較快,可能是因為合并連接策略。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384206.html
標籤:sql PostgreSQL的 查询优化 亚马逊 sql-删除
