2012-02-22 10 views
0

私は大きなテーブルを持っています(2M +レコードには列があります)。重複除外の目的でGROUP BYを実行するつもりです。次の2つの戦略のどちらが優れているか知りたいですか?複数の列(col_a、col_b、col_c) PostgresのGROUP BYのパフォーマンス

  • BY

    1. GROUPはcol_a、col_b、col_cを用いて形成された正規化された文字列からなる新しい列dedup_colを追加しdedup_colにGROUP BYを行います。 dedup_colには事前に入力されます。

    私はベンチマークを実行することができますが、実装を開始する前に理論的な入力をしたいと思います。

  • 答えて

    3

    は、あなたが#1で深刻なパフォーマンスオプションを持っていて、それを解決するために(インデックスを含む)他のすべてのオプションを使い果たしていない限り、#2に頼らないでくださいオプション1で行きます。

    オプション2はひどいアイデアです。効果的に、貧しい男性のバージョンのインデックスを実装することによって、ホイールを再発明しています...ひどく。

    決して、今まで、これまで、デノーマライズあなたはパフォーマンス上の問題を特定したまで、パフォーマンスのためにあなたのデータを(それはあなたがオプション2でやっていることです)。それでも、あなたはおそらくそれをしてはいけません。

    FYI:あなたはあなたのインデックスが正しく設定されている場合2万のレコードは、大きなデータベースではありません。

    3

    私はさまざまなクエリでEXPLAIN PLANを実行してコストを比較しました。それはここで得られる理論的な答えよりも価値があるでしょう。 PostgreSQLで何ができるか教えてください。

    0

    私は通常、このために使用して終了方法は、CTIDキーを使用することです。たとえば:

    delete from yourtable 
    where ctid not in (
    SELECT MAX(dt.ctid) 
    FROM yourtable As dt 
    GROUP BY dt.col_a, dt.col_b, dt.col_c); 
    

    しかし、他の多くのオプションがありますが...多くは、テーブル、インデックスの数に依存し、私はまた、インスタンスを持っていたように...削除はいえ高価なことができます一意の行から選択して新しいテーブルを作成し、オリジナルテーブルを削除して新しいテーブルの名前を元の名前に変更する方がよい場合がありました。神の愛のために

    +0

    はまた、チェックアウト:http://www.postgresonline.com/journal/archives/22-Deleting-Duplicate-Records-in-a-Table.html –