मुझे 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;
?