41

クエリは基本的に次のとおりです。

SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...

クエリの一部が低速で実行される理由であると100%確信しているふりをしてDISTINCT、混乱を避けるために残りのクエリを省略しました。これは、私が主に懸念しているのは個別の部分の低速であるためです(個別の常に速度低下の原因)。

問題のテーブルには、250万行のデータがあります。ここにリストされていない目的のためDISTINCT 必要です(変更されたクエリを元に戻したくないので、可能であれば、個別のクエリをDBMSレベルでより高速に実行するための一般的な情報です)。

DISTINCTSQLを変更せずに(具体的にはPostgres 9を使用して)実行を高速化するにはどうすればよいですか(つまり、このSQLを変更することはできませんが、DBレベルで何かを最適化するためのアクセス権があります)。

4

3 に答える 3

29

DISTINCT により、重複を見つけるために出力行が並べ替えられます。クエリによって選択された列にインデックスを配置すると、データベースはそれらをインデックス順に読み取り、並べ替え手順を保存できる場合があります。多くは、クエリの詳細と関連するテーブルに依存します。「問題が DISTINCT にあることを知っている」というあなたの発言は、利用可能な回答の範囲を実際に制限します。

于 2011-07-06T15:29:04.453 に答える
7

データセットのサイズに応じて、work_mem設定を増やしてみることができます。これにより、クエリプランがハッシュ集計に切り替わり、通常は高速になります。

ただし、グローバルに高く設定しすぎる前に、まずそれを読んでください。max_connections設定はこの数値の乗数として機能するため、サーバーを簡単に爆破できます。

つまり、設定して(デフォルト)work_mem = 128MBを設定しmax_connections = 100た場合、12.8GBを超えるRAMが必要になります。基本的に、サーバーがクエリを実行するためにそれだけ使用できることをサーバーに伝えています(Postgresなどによる他のメモリ使用を考慮していません)。

于 2011-07-08T00:40:23.817 に答える