У мене проблеми з плануванням запитів 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;
?