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