1

私は 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クエリプランナーで真剣に疑い始めました...

4

2 に答える 2

2

FOREIGN KEY 関係の両側に索引を付けましたか? 特に、 のインデックスはありPayments.PaymentOrderIDますか?

于 2012-11-16T21:30:54.430 に答える
0

po."Id" = p."PaymentOrderId" は同じ型ですか? プランナーがインデックスを使用して結合するには、それらが一致する必要があります。

于 2012-11-19T01:15:50.050 に答える