পোস্টগ্র্রেএসকিউএল 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
এবং পরিকল্পনাকারীর জন্য অন্য কোনও অনুরূপ বিকল্প। তবে আমি কীভাবে পরিকল্পনাকারীকে নেস্ট লুপগুলি অক্ষম না করে হ্যাশ যোগ দিতে ব্যবহার করতে "বোঝাতে" পারি?
ক্যোয়ারিতে পুনর্লিখন করা একটি বিকল্প।
যদি আমি এমন কোনও ক্যোয়ারী চালান যে কোনও ভূমিকার অধীনে আরএলএসকে ছাড়িয়ে যায়, তবে এটি খুব দ্রুত কার্যকর করা হয়। সারি-স্তরের সুরক্ষা নীতিটি দেখে মনে হচ্ছে:
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;
?