PostgreSQL 9.6 sorgu planlamasında sorun yaşıyorum. Sorgum şöyle görünüyor:
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)
Yukarıda kullanılan tablolar için Satır Düzeyinde Güvenlik etkin.
ile
set enable_nestloop = True
, sorgu planlayıcı Nested Loop'u yaklaşık 37 saniyelik toplam çalışma süresiyle birleştirir: https://explain.depesz.com/s/59BRile
set enable_nestloop = False
, Karma Birleştirme yöntemi kullanılır ve sorgu süresi yaklaşık 0,3 sn'dir: https://explain.depesz.com/s/PG8E
VACUUM ANALYZE
Sorguları çalıştırmadan önce yaptım , ama yardımcı olmadı.
Plancı için iyi bir uygulama olmadığını set enable_nestloop = False
ve benzer herhangi bir seçenek olmadığını biliyorum . Ancak, planlayıcıyı iç içe döngüleri devre dışı bırakmadan karma birleştirmeleri kullanmaya nasıl "ikna edebilirim"?
Sorguyu yeniden yazmak bir seçenektir.
Aynı sorguyu RLS'yi atlayan bir rol altında çalıştırırsam, çok hızlı yürütülür. Satır düzeyinde güvenlik ilkesi şöyle görünür:
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
);
Herhangi bir fikir veya öneri büyük mutluluk duyacağız.
AND properties."TYPE_ID" IN (6);
ve olmasın= 6;
?