Explain.depesz.comにクエリプランを投稿しました。ご覧ください。
クエリプランナーの見積もりは、場所によってはひどく間違っています。ANALYZEを実行しましたか 最近?
PlannerおよびPlannerのコスト定数で使用される統計に関するマニュアルの章をお読みください。 random_page_costの章に特に注意してください およびdefault_statistics_target 。
試してみてください:
ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;
または、1,000万行のテーブルの場合はさらに高くします。データ配信と実際のクエリによって異なります 。実験。デフォルトは100、最大は10000です。
そのサイズのデータベースの場合、1MBまたは5MBの work_memのみ 一般的には十分ではありません。 @alerootがリンクしているTuningPostgresに関するPostgresWikiページを読んでください。
クエリにはディスク上の430104kBのメモリが必要です EXPLAINによると 出力、work_memを設定する必要があります 500MBのようなものに メモリ内の並べ替えを可能にするために、またはそれ以上。データのメモリ内表現には、ディスク上表現よりもいくらかのスペースが必要です。トムレーンが最近その件について投稿した内容に興味があるかもしれません。
work_memを増やす あなたが試したように、ほんの少しでも、あまり役に立たないか、遅くなることさえあります。これをグローバルに高く設定すると、特に同時アクセスの場合、さらに害を及ぼす可能性があります。複数のセッションでリソースが不足する可能性があります。リソースが限られている場合、ある目的にさらに割り当てると、別の目的からメモリが奪われます。最適な設定は、完全な状況によって異なります。
副作用を回避するには、セッション内でローカルに十分な高さに設定し、一時的にクエリ用に設定します:
SET work_mem = '500MB';
後でデフォルトにリセットします:
RESET work_mem;
または、 SET LOCALを使用します 現在のトランザクションで開始するためだけに設定します。