私は現在、OracleからPostgresSQLへアプリケーションを移植しています。私はOracleと同じ問題を抱えています。これはこれを試して修正する良い時期のようです。 、SQL:この選択クエリを高速化するにはどうすればよいですか?
はcreate table T1(
id bigserial primary key,
a integer,
b char(5),
c char(2),
);
今、すべてのは、今して、私はユニークなA、Bのどのセットを知っておく必要があります。
はとにかく、私はこのようになります/日100kの行を追加すること周り200M行を持つテーブルを持っていますCの値はそうです。そのようなようなクエリが表示されます。私は、テーブルの結合が問題にほとんど関係しないと思うが、私は完全性のためにそれらを含めている。
SELECT DISTINCT A, B, C, T3.N
FROM T1
JOIN T2 ON T2.ID = T1.A AND T2.NAME = 'FOO'
JOIN T3 ON T3.ID = T2.PID
はまた、このようになりますインデックス:それは代わりにテーブルスキャンのインデックス・スキャンが可能になりますので、
CREATE INDEX I ON T1(A,B,C);
指数はすでに物事をスピードアップします。
このクエリは通常、約1分かかり、100行未満を返します。私は約1ミリ秒かかると思います。私は素朴な解決策は、これらの値を追跡するための新しいテーブルを作成することだと思うし、T1に新しいレコードを追加するときにそこのA、B、Cタプルだけをチェックし、まれな出来事。これは面倒なようで、2つのテーブルを使用するよりも良い方法があるはずです。
GROUP BYトリックを使用しても、インデックス全体をスキャンしているため、予想どおり、あまり効果がありません。
クエリプランは次のようになります。
我々はT2中での発現が、それはT1のインデックスの巨大な塊をフィルタとして予想通り、かなりの助けに参加することを見ることができます。
結合が不適切であるという前提に従ってクエリプランを共有できますか?実際のクエリプランを見れば、おそらくもっと良い答えを得ることができます。 –
クエリプランが追加されました。あなたが見ることができるようにT2とT3は非常に小さいです。 T2.IDとT3.IDは主キーです。 (これもテストデータで、T1は〜45M行です)。 – Krum
[Materialized Views](https://www.postgresql.org/docs/current/static/rules-materializedviews.html)オプションも試しましたか? –