速度低下の原因は、PostgreSQLがネストされたループ結合を選択する原因となる行数の見積もりが悪いことです。ほとんどすべての時間は、hfj_res_link
のインデックススキャンに費やされます。 、1113回繰り返されます。
私の最初の試みは、ANALYZE hfj_spidx_date
です。 それが役立つかどうかを確認してください。はいの場合は、自動分析がそのテーブルをより頻繁に処理するようにしてください。
次の試みは
SET default_statistics_target = 1000;
次にANALYZE
上記のように。それが役立つ場合は、ALTER TABLE
を使用してください STATISTICS
を増やす hash_identity
で およびsp_value_high
列。
それでも問題が解決せず、PostgreSQLの最新バージョンを使用している場合は、拡張統計を試すことができます。 :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
次に、ANALYZE
テーブルをもう一度見て、それが役立つかどうかを確認してください。
それでも問題が解決せず、見積もりを正しく取得できない場合は、別の角度から試してみる必要があります。
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
これにより、インデックススキャンが大幅に高速化され、良好な応答時間が得られます。
最後に、上記のいずれにも影響がない場合は、このクエリでネストされたループ結合を禁止するという基本的な方法を使用できます。
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;