postgres 9.0では、index_scanとseq_scanの両方をオフに設定します。クエリのパフォーマンスが2倍向上するのはなぜですか?
2 に答える
これにより、一部のクエリの実行が速くなる可能性がありますが、他のクエリが遅くなることはほぼ確実です。診断目的では興味深い情報ですが、長期的な「解決策」としてはお勧めできません。
PostgreSQL はコストベースのオプティマイザーを使用します。これは、テーブルをスキャンして (通常は自動バキュームによって) 収集された統計とコスト要因に基づいて、考えられるすべてのプランのコストを調べます。最速のプランを選択していない場合、通常は、コスト要因が環境の実際のコストを正確にモデル化していないか、統計が最新ではないか、統計が十分に細かく設定されていないことが原因です。
電源index_scan
をseq_scan
入れ直した後:
私は通常、
cpu_tuple_cost
デフォルトが低すぎることに気づきました。デフォルトの 0.01 ではなく 0.03 に設定することで、より良いプランが選択されるのをよく見てきました。オーバーライドが問題を引き起こすのを見たことがありません。データベースのアクティブな部分が RAM に収まる場合は、 と の両方を 0.1 に減らしてみて
seq_page_cost
くださいrandom_page_cost
。OSがキャッシュとして表示しているもの
effective_cache_size
の合計に必ず設定してください。shared_buffers
自動バキュームを無効にしないでください。パラメーターを調整したい場合がありますが、小さな増分変更とその後の監視を行いながら、非常に慎重に行ってください。
特に、多くの変更が加えられたばかりでクエリで使用されようとしている一時テーブルまたはテーブルの場合は、明示的な
VACUUM ANALYZE
orコマンドを時々実行する必要がある場合があります。ANALYZE
default_statistics_target
、、、またはいくつかfrom_collapse_limit
のjoin_collapse_limit
geqo 設定を増やしたい場合があります。しかし、これまでに与えられたよりも多くの詳細がなければ、それらが適切かどうかを判断するのは困難です.
1 つの接続でさまざまなコスト要因を設定してクエリを試すことができます。ミックス全体で適切に機能する構成 (つまり、環境内のコストを正確にモデル化する構成) を確認したら、postgresql.conf
ファイルを更新する必要があります。
より的を絞ったヘルプが必要な場合は、テーブルの構造、クエリ自体、およびクエリの実行結果を示してくださいEXPLAIN ANALYZE
。PostgreSQL の構成とともに、OS とハードウェアの説明も大いに役立ちます。
なんで ?
最も論理的な答えは、データベース テーブルの構成方法によるものです。
テーブルスキーマを投稿しないと、インデックスのカーディナリティが高くないという推測しかできません。
つまり、インデックスに含まれる情報が多すぎて役に立たない場合、効率が大幅に低下するか、実際には遅くなります。
カーディナリティは、インデックス内の行がどの程度一意であるかの尺度です。カーディナリティが低いほど、クエリは遅くなります。
完璧な例は、インデックスにブール フィールドを持つことです。おそらく、データベースに Contacts テーブルがあり、顧客が第三者からの連絡を希望しているかどうかに応じて true または false を記録するブール値の列があります。
ちなみに、「select * from Contacts where OptIn = true」を選択した場合は、多くの連絡先を返すことは想像できます。私たちの場合、連絡先の 50% を想像してみてください。
この「Optin」列を同じテーブルのインデックスに追加すると、他のセレクターがどれほど優れていても、'OptIn' の値により、常にテーブルの 50% を返すのは当然のことです。
これはカーディナリティが低いことの完璧な例です。そのインデックスを含むクエリは、テーブル内の行の 50% を選択する必要があるため、遅くなります。その後、さらに WHERE フィルターを適用してデータセットを再び削減できます。
簡単に言えば。インデックスに不適切なフィールドが含まれているか、単にテーブル内のすべての列を表している場合。その場合、SQL エンジンは行ごとにテストする必要があります。
とにかく、あなたの場合、上記は理論的です。しかし、これは、クエリの実行時間が突然長くなる既知の一般的な理由です。
データ構造、インデックス定義、および実際のクエリが非常に遅いことに関するギャップを埋めてください。