PostgreSQL-複数のクエリを同時に実行すると、どのような状況で速度が向上しますか?どのような状況で減速が見られますか?


10

私はDBAではない人として謙虚にあなたにアプローチします。そして、私の質問は概念的な欠点と「それは地雷に依存している」に満ちていると確信しています。また、私が回答することを選択したすべての人が、私が現在提供できるよりも詳細な方法で多くのことを望んでいることもかなり確信しています。

とはいえ、私は一般的に次のシナリオに興味があります。

  • 2つの重要なクエリがあるとします。
  • クエリ1の平均所要時間は2分です。
  • クエリ2の平均所要時間は5分です。

順次実行すると、平均して完了するまでに7分かかると思います。これは妥当ですか?

ただし、2つのクエリを同時に実行するとどうなるでしょうか。同時に2つの別々の接続。

  • どのような条件下でスピードアップが見込めますか?(合計時間<7分)
  • どのような状況下で減速が予想されますか?(合計時間> 7分)

さて、1,000個の重要なクエリを同時に実行していると、全体的に速度が低下するという直感があります。その場合、ボトルネックはどこにあるでしょうか?プロセッサー?羊?ドライブ?

繰り返しますが、詳細を知らない限り、質問に正確に答えることはおそらく不可能であることを知っています(私は持っていません)。次の質問をするときに検討するいくつかの一般的なガイドラインを探しています:

  • どのような状況下で、同時クエリによって全体的な速度が向上しますか?
  • どのような状況で同時クエリが全体的な速度低下を引き起こしますか?

回答:


14

順次実行すると、平均して完了するまでに7分かかると思います。これは妥当ですか?

関連のないデータセットを使用する場合は、はい。

データセットを共有し、最初のクエリのキャッシュがコールドで、クエリの大部分がI / Oにバインドされている場合、2番目のクエリはすぐに完了する可能性があります。パフォーマンス分析とクエリのタイミングを処理するときは、キャッシュの影響を考慮する必要があります。

ただし、2つのクエリを同時に実行するとどうなるでしょうか。同時に2つの別々の接続。

"場合によります"。

両方が同じテーブルの順次スキャンを使用している場合、PostgreSQLでは、同期された順次スキャンをサポートしているため、パフォーマンスが大幅に向上します。

同じインデックスを共有している場合は、お互いにキャッシュに読み込んでいることによるメリットがあるでしょう。

それらが独立していて、異なるデータに触れている場合は、I / O帯域幅をめぐって競合する可能性があり、その場合、順次実行する場合と同じ時間がかかる可能性があります。I / Oサブシステムが同時実行性(より多くのクライアントで高いネットスループット)の恩恵を受ける場合、合計時間は短くなる可能性があります。I / Oサブシステムが並行性をうまく処理できない場合、それらを順次実行するよりも時間がかかる可能性があります。または、それらはI / Oにバインドされていない可能性があります。その場合、それぞれに空きCPUがあれば、もう一方がまったく実行されていないかのように実行できます。

これは、ハードウェアとシステムの構成、データセット、およびクエリ自体に大きく依存します。

さて、1,000個の重要なクエリを同時に実行していると、全体的に速度が低下するという直感があります。その場合、ボトルネックはどこにあるでしょうか?プロセッサー?羊?ドライブ?

はい、それは多くの理由で物事を遅くする可能性が非常に高いでしょう。

  • プロセス間の連携、トランザクションとロック管理におけるPostgreSQLの自身のオーバーヘッドは、など、バッファ管理これは非常に大きなコストとすることができ、PostgreSQLは本当に高いクライアントのカウントのために設計されていない- それはあなたの場合、キューの作業良い作品

  • ワーキングメモリ、キャッシュなどの競争

  • OSスケジューリングのオーバーヘッドにより、必要なすべてのタイムスライスを処理する1000の競合プロセスを処理します。最近のマイナーな、最近のOSは高速スケジューラーを備えています。

  • I / Oスラッシング。ほとんどのI / Oシステムには、ピークパフォーマンスのクライアント数があります。1の場合もあります。つまり、クライアントが1つだけの場合に最適ですが、多くの場合はそれより高くなります。パフォーマンスがしきい値を超えて再び低下することがあります。時にはそれは高原に達するだけです。


これがまさに私が探していた説明です。明確、簡潔、有益。ありがとう!
アーロンジョンソン

@Craig Ringer様、1つのテーブル(2億行)に対して1000のクエリを同時に実行するとどうなるでしょうか。Postgresはそれらをうまく処理しますか?同期順次スキャンは役立ちますか?
Rahul Gautam 2017年

@RahulGautam詳細が記載された新しい質問に、この問題へのリンクが付いています。
クレイグリンガー

@CraigRingerが追加されました。dba.stackexchange.com/questions/188649/…を
Rahul Gautam

@RahulGautamあなたのリンクは死んでいます。何が起こったのかについての最新情報を提供できますか?非常に興味深いトピックです。
Zeruno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.