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 초의 총 실행 시간으로 Nested Loop 결합을 실행합니다. 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;
?