PostgreSQL 9.6のクエリ計画に問題があります。私のクエリは次のようになります:
SET role plain_user;
SELECT properties.*
FROM properties
JOIN entries_properties
ON properties.id = entries_properties.property_id
JOIN structures
ON structures.id = entries_properties.entry_id
WHERE structures."STRUKTURBERICHT" != ''
AND properties."COMPOSITION" LIKE 'Mo%'
AND (
properties."NAME" LIKE '%VASP-ase-preopt%'
OR properties."CALCULATOR_ID" IN (7,22,25)
)
AND properties."TYPE_ID" IN (6)
上記で使用したテーブルに対して行レベルのセキュリティを有効にしています。
を使用する
set enable_nestloop = True
と、クエリプランナーはネストループを実行し、合計実行時間は約37秒になります。https://explain.depesz.com/s/59BRを
set enable_nestloop = False
使用すると、ハッシュ結合メソッドが使用され、クエリ時間は約0.3秒です。https: //explain.depesz.com/s/PG8E
VACUUM ANALYZE
クエリを実行する前に行いましたが、役に立ちませんでした。
set enable_nestloop = False
、およびプランナーにとって他の同様のオプションは良い習慣ではないことを知っています。しかし、ネストされたループを無効にせずにハッシュ結合を使用するようにプランナーを「確信」させるにはどうすればよいでしょうか。
クエリの書き換えはオプションです。
RLSをバイパスするロールで同じクエリを実行すると、非常に高速に実行されます。行レベルのセキュリティポリシーは次のようになります。
CREATE POLICY properties_select
ON properties
FOR SELECT
USING (
(
properties.ouid = get_current_user_id()
AND properties.ur
)
OR (
properties.ogid in (select get_current_groups_id())
AND properties.gr
)
OR properties.ar
);
任意のアイデアや提案をいただければ幸いです。
AND properties."TYPE_ID" IN (6);
か= 6;
?