我已經閱讀了關於這個主題的許多線索,並嘗試了一些東西,但它沒有像我希望的那樣工作。如果這被認爲是重複線程,我需要澄清並表示歉意。在多列上的大表中查找重複記錄正確的方法
我的一位客戶託管一個Postgres數據庫,其中一張表擁有超過1200萬條記錄。他們責成我查找重複記錄,提取它們以供查看,如果一切正常,請刪除重複記錄。
我主要關心的是服務器的性能。對1200萬條記錄運行DISTINCT查詢必須消耗大量資源?
由於我的第一個任務是提取記錄以便在CSV中查看,而不是簡單地刪除它們,所以我在PgAdmin中的方法是將它執行到文件中。
SELECT *
FROM
my_table
WHERE
my_table_id NOT IN (
SELECT DISTINCT
ON (
num_1,
num_2,
num_3,
num_4,
num_5,
my_date
)
my_table_id
FROM
my_table
);
但是,這個查詢要花很長時間。執行20分鐘後,我停止執行。爲了使事情更加複雜,我的客戶不願意允許我克隆表的本地副本,因爲它有嚴格的安全性。他們更喜歡它是在現場主機環境中完成的。
表格定義非常簡單。它看起來像這樣
CREATE TABLE my_table
(
my_table_id bigserial NOT NULL,
num_1 bigserial NOT NULL,
num_2 bigserial NOT NULL,
num_3 bigserial NOT NULL,
num_4 numeric,
num_5 integer,
my_date date,
my_text character varying
)
主鍵「my_table_id」沒有被破壞,並且始終是唯一的。在查詢中,col「my_text」不是很有趣,因爲它對於所有重複項都是空的。它只是數字字段和需要匹配的日期。所有列(my_table_id和my_text除外)必須匹配記錄以符合重複條件。
解決此問題的最佳方法是什麼?是否有一種服務器友好的方式,不會佔用主機環境中的所有資源?請幫我理解最好的方法!
謝謝你!
四(大)連續在一個表中是沒有意義的。設置它們是重複的需要技巧,雖然... – joop 2014-10-06 16:23:50
在這種情況下,我不負責數據庫設計joop。他們必須非常熟練,因爲那裏有將近200k重複。 – 2014-10-06 18:20:18
如果您有責任:解僱他們。這是瘋狂。順便說一句:* my_table *有主鍵嗎?只是問... – wildplasser 2014-10-06 22:35:04