2014-10-06 43 views
3

我已經閱讀了關於這個主題的許多線索,並嘗試了一些東西,但它沒有像我希望的那樣工作。如果這被認爲是重複線程,我需要澄清並表示歉意。在多列上的大表中查找重複記錄正確的方法

我的一位客戶託管一個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除外)必須匹配記錄以符合重複條件。

解決此問題的最佳方法是什麼?是否有一種服務器友好的方式,不會佔用主機環境中的所有資源?請幫我理解最好的方法!

謝謝你!

+0

四(大)連續在一個表中是沒有意義的。設置它們是重複的需要技巧,雖然... – joop 2014-10-06 16:23:50

+0

在這種情況下,我不負責數據庫設計joop。他們必須非常熟練,因爲那裏有將近200k重複。 – 2014-10-06 18:20:18

+0

如果您有責任:解僱他們。這是瘋狂。順便說一句:* my_table *有主鍵嗎?只是問... – wildplasser 2014-10-06 22:35:04

回答

3

需要使用GROUP BYHAVING獲得的,而不是DISTINCT

子查詢重複記錄會發現所有的重複記錄

SELECT * FROM 
my_table mt 
JOIN 
(
    SELECT 
      num_1, 
      num_2, 
      num_3, 
      num_4, 
      num_5, 
      my_date 
    FROM 
      my_table 
    GROUP BY num_1, num_2, num_3, num_4, num_5, my_date 
    HAVING COUNT(*) >1 
) T 
ON mt.num_1= T.num_1 
and mt.num_2= T.num_2 
and mt.num_3= T.num_3 
and mt.num_4= T.num_4 
and mt.num_5= T.num_5 
and mt.my_date= T.my_date 
+0

謝謝Rajesh!這工作得很好,速度非常快。絕對可以在1200萬條記錄上運行。 – 2014-10-06 18:23:10

2

另一種方法使用分析功能

select * from (
    select * , 
    count(*) over (partition by num1,num2,num3,num4,my_date) cnt 
    from mytable 
) t1 where cnt > 1 
+0

謝謝!我在另一篇文章中讀到了這個方法,但還沒有完全開始工作。然而,你的exampel運作良好。 – 2014-10-06 18:25:32