У меня проблема с планированием запросов 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
помощью планировщика запросов выполняется объединение Nested Loop с общим временем выполнения около 37 секунд: https://explain.depesz.com/s/59BRПри
set enable_nestloop = False
использовании метода Hash Join время запроса составляет около 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;
?