私は PostgreSQL に非常に慣れていないので、明らかなことが明らかでない場合はご容赦ください。6 つのテーブルに分散された最大 4 億 5000 万行のデータベースがあります (すべてのテーブルに主キーがあります)。次のクエリを実行すると:
SELECT * FROM "Payments" AS p
JOIN "PaymentOrders" AS po ON po."Id" = p."PaymentOrderId"
WHERE po."Id" = 1000
po.「Id」は主キーです。データベース全体を VACUUM ANALYZED しただけです。EXPLAIN ANALYZE の詳細はこちらで確認できます。PaymentOrders テーブルには 4,000 万行が含まれ、Payments には 3 億 5,000 万行が含まれます。Windows 8 マシン、I5 CPU (4 コア 3.3 GHz)、8 GB の RAM で x64 PostgreSQL 9.2 を実行しています。また、私の postgresql.conf ファイルもここで見ることができます。
このクエリが Payments テーブルでシーケンシャル スキャンを引き起こす理由を知っている人はいますか? 何か間違ったことをしていますか、それとも PostgreSQL に重大な欠陥がありますか? PostgreSQLクエリプランナーで真剣に疑い始めました...