1

Postgresql に基づくデータ ウェアハウスがあります。

これまで、実際のデータベースのほんの一部を含むデータベースに対してクエリを実行しようとしてきました。この小さなテスト データベースで効率的にクエリを作成したら、実際のデータベースでクエリを実行します。

問題は、実際のデータベースでクエリを実行すると、実際のデータベースがメモリ不足になり、インデックスや一時テーブルなどをディスクに書き始めることです。これは、テスト データベースと実際のデータベースに最適なクエリが異なる可能性があることを意味します。これは、どのクエリが最適かを知るために、完了するまでに数分かかるクエリを実際に実行する必要があることを意味しますか?

4

2 に答える 2

1

EXPLAIN出力を解釈する方法を学びEXPLAIN、クエリを実行する前に、大規模なデータベースで選択したクエリ プランが期待どおりであることを出力が示していることを確認します。

于 2011-01-31T00:59:31.673 に答える
0

3 つの質問:

1) クエリはどれくらい複雑ですか? インデックスと一時テーブルの生成は、インデックスのない列に対する複雑な操作のために、サーバーがこれらのものを生成する必要があることを示唆しています。これはどのくらいの確率ですか?あなたが報告したことから、おそらく答えは「複雑」のようです

2) 返品セットの大きさは? 最終結果は 100 行ですか、それとも 100 万行ですか? あなたが報告したことから、答えは何でもありえます。この質問はそれほど重要ではないと思いますが、少なくとも知っておくことは重要です。

3) 質問 1 を別の方法で言い換えると、返されたセットが小さい場合でも、小さな結果に至る途中でコンパイルする必要がある膨大な中間結果がありますか? 繰り返しますが、ここでの答えは、大規模で複雑な中間結果が生成されていることだと思います。

これは、少なくともいくつかのものにインデックスを付ける必要があることを示唆しており、おそらく、クエリしようとしているものに近づけるために途中でデータを構造化する必要があります。

最後にもう 1 つ質問があります。これは、より重要なクエリのほとんどに蔓延している問題ですか、それとも 1 つまたは 2 つのクエリだけですか?

コメントに応じて編集: 私は一日中データ ウェアハウスのクエリを実行しており、中には 10 分ほどかかるものもあります。中には何時間もかかるものもあり、私はそれらをバックグラウンド ジョブにプッシュし、ステージに分割して、すべてが行き詰まるのを防ぎます。これが、非常に大きなデータ セットを処理する性質です。

元の回答の私の質問は、問題のクエリが終了するかどうかを把握することを目的としています。大量の中間データを生成するクエリを無意識のうちに作成して、2 日後に戻ってきてもまだ実行されている可能性があります。ですから、元の 3 つの質問をもう一度言い直します。実際には、これらがあなたの質問に完全に答える唯一の方法です。

要約: はい、一部のクエリはさらに時間がかかります。これは獣の性質です。期待できる最高のパフォーマンスは、読み取られるデータの量に比例するパフォーマンスであり、処理する行が 1 億行ある場合は、数秒ではなく数分かかります。しかし、もっと重要なことは、クエリが 100 万行で 4 秒で実行され、1 億行では >> 400 秒 (1 時間程度) かかる場合、私が尋ねた元の質問は、最適化を目的として、理由を理解するのに役立ちます。それらのクエリ。

于 2011-01-28T01:26:12.350 に答える