我在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;
?