ฉันมีปัญหากับการวางแผนการสืบค้น 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วิธีการเข้าร่วมแฮชและใช้เวลาแบบสอบถามประมาณ 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;?