2010-12-06 18 views
1

私はデータを抽出したいSQLログが大量にあります。私はいくつかの列でグループ化しているので、この作業には非常に時間がかかります。したがって、私はSQL側でGROUP BYを実行せずに、通常はグループ化する列とともにログを抽出することにしました。代わりに私はPerlを使って私のグループ化をしたいと思っています。 Perlを使用する場合、私が考えている解決策は、異なる列にグループ化するためにn次元のハッシュを作成することです。私が同じことを可能にするコマンドラインユーティリティやPerl関数はありますか?GROUP BY Perlを使用して

+3

グループ化を行います。代わりに、そのクエリを最適化する必要があります。 – Ether

+0

ちょうど好奇心から...あなたはグループで問題を抱えていると信じていましたか? – Ronnis

答えて

2
  1. Etherがコメントで言ったように、実際に設計され、ジョブに最適化されたツールを仕事にしましょう。適切に最適化されたクエリを実行しているデータベースサーバーは、DBの外部で達成することができるよりも遅くなる可能性は非常に低いです。

    とりわけ、ネットワーク経由でより多くのデータを送信するためのリソースが無駄になり、より多くのメモリが必要になります。

    最適化の1つとして、完全なスキーマとクエリとDBエンジンを使用することなく、一時テーブルを使用してみてください。

    例えば、グループ化されたキーが重複している行が非常に少ない場合など、DBの外部からのアプローチが適している場合があります。この場合、グループ化されたデータを送信するリソースはほとんど節約できません;そしてPerl側のあなたのロジックが、繰り返し実行するのではなく、繰り返し実行するのではなく、メモリにすべての行を格納する必要があったとき。

  2. まだこれをPerlでやってみたいのであれば、良い方法はSINGLEレベルのハッシュを作成し、一意のキー列の値を1つのハッシュ値にエンコードする安価な方法を開発することです(pack /いくつかの状況で使用することも、分割/結合することも、より具体的ではあるがより良い実行方法を使用することもできます。唯一の要件は、エンコードされた値を一意のキー列値に一意にマップできることです。それはおそらくどの速くデータベースをさせるよりもするつもりはない

    # Store 
    my %storage; 
    foreach my $row (@$result_set) { 
        my $hash_key = encode_hash_key(row); 
        my $new_row = $row; 
        if (exists $storage{$hash_key}) { 
         $new_row = merge_rows($row, $storage{$hash_key}); 
        } 
        $storage{$hash_key} = $new_row; 
    } 
    
+0

良い、安価な方法は、( "$;" はperldoc -vを参照してください)perlの古い多次元配列のエミュレーションを使用するので、このような何か:$ストレージ{$行 - > {フィールド1}、$行 - > {フィールド2}、$行 - > {FIELD3}} = merge_row($記憶{行 - > {FIELD1}、$行 - > {FIELD2}、$行 - > {FIELD3}} $行)。 – MkV

+0

又はencode_hash_keyは単に – MkV

+0

@MKV($行{@group_by_fields} @ $ ;,)に参加する - 符号化値がカンマを含むことができ、分割介し復号のコスト、ならびに付随する複雑であるようにキー接合の欠点を。あなたは、デコード心配している場合、それは方法の一つが、いくつか(または多くの)状況ではない最高のいずれかを実行することができます。 – DVK