NULL মান সহ বুলিয়ান বিরুদ্ধে কোয়েরি করার সময় অপ্রত্যাশিত Seq স্ক্যান


10

আমি একটি ডাটাবেস কলাম নামের auto_reviewযেখানে কলাম ধরনের boolean। অ্যাক্টিভেকর্ড ORM ব্যবহার করে তৈরি করা হয়েছে সেই ক্ষেত্রটির জন্য একটি সূচক রয়েছে।

CREATE INDEX index_table_on_auto_renew ON table USING btree (auto_renew);

আমি যখন বুলিয়ান মানের জন্য ক্ষেত্রটি জিজ্ঞাসা করি, তখন পিজি প্রত্যাশা অনুযায়ী সূচকটি ব্যবহার করে।

EXPLAIN for: SELECT "table".* FROM "table"  WHERE "table"."auto_renew" = 'f'
                                          QUERY PLAN
----------------------------------------------------------------------------------------------
 Bitmap Heap Scan on table  (cost=51.65..826.50 rows=28039 width=186)
   Filter: (NOT auto_renew)
   ->  Bitmap Index Scan on index_domains_on_auto_renew  (cost=0.00..44.64 rows=2185 width=0)
         Index Cond: (auto_renew = false)
(4 rows)

মানটি হলে NULL, একটি ক্রমিক স্ক্যান ব্যবহৃত হয় is

EXPLAIN for: SELECT "table".* FROM "table"  WHERE "table"."auto_renew" IS NULL
                           QUERY PLAN
----------------------------------------------------------------
 Seq Scan on table  (cost=0.00..1094.01 rows=25854 width=186)
   Filter: (auto_renew IS NULL)
(2 rows)

আমি এই পছন্দ পিছনে কারণ জানতে আগ্রহী।

উত্তর:


19

সাধারণত, col IS NULL(ডিফল্ট) বি-ট্রি ইনডেক্স অনুসন্ধানের সম্ভাব্য প্রার্থী। ম্যানুয়াল :

এছাড়াও, একটি সূচক কলামে একটি IS NULLবা IS NOT NULLশর্ত বি-ট্রি সূচক ব্যবহার করা যেতে পারে।

প্রমাণ পেতে, অনুক্রমিক স্ক্যানগুলি অক্ষম করুন (কেবলমাত্র একটি পরীক্ষার সেশনে!):

SET enable_seqscan = OFF;

আমি এখানে ম্যানুয়াল উদ্ধৃত :

enable_seqscan (boolean)

ক্রিয়াকলাপ স্ক্যান পরিকল্পনার ধরণগুলির জন্য ক্যোয়ার পরিকল্পনাকারীর ব্যবহার সক্ষম বা অক্ষম করে। ক্রমক্রমিক স্ক্যানগুলি পুরোপুরি দমন করা অসম্ভব তবে এই পরিবর্তনশীলটি বন্ধ করে দেওয়া যদি অন্য পদ্ধতি উপলব্ধ থাকে তবে এটির ব্যবহারকারীর একটির ব্যবহার থেকে নিরুৎসাহিত করে। ডিফল্ট চালু আছে।

তারপরে আবার চেষ্টা করুন:

EXPLAIN ANALYZE SELECT * FROM tbl WHERE auto_renew IS NULL;

এটি সম্ভবত বিটম্যাপ সূচক স্ক্যানের ফলাফল করবে যা টেবিলের ক্রমিক স্ক্যানের চেয়ে ধীর

পুনরায় সেট করুন, বা সেশনটি বন্ধ করুন (সেটিংসটি সেশন-স্থানীয়।

RESET enable_seqscan;

booleanকলামগুলিতে সূচি শুধুমাত্র কিছু ক্ষেত্রে কার্যকর। পরিকল্পনাকারী কেবলমাত্র একটি সূচক ব্যবহার করে যদি এটি প্রত্যাশা করে যে এটি দ্রুত হবে। গণনাগুলি আপনার ব্যয় সেটিংস এবং সংগৃহীত পরিসংখ্যানের উপর ভিত্তি করে ANALYZE। যদি টেবিলের একটি বিশাল অংশ আপনার অবস্থার সাথে মেলে (প্রায় 5% বা তার বেশি এটি নির্ভর করে), পরিবর্তে একটি পূর্ণ টেবিল স্ক্যান করা সাধারণত দ্রুত হয়।

এটি সরল সূচীর একমাত্র দরকারী প্রার্থী হিসাবে কলামে বিরল মান ফেলে boolean। এবং এটির পরিবর্তে একটি (আরও বিশেষায়িত) আংশিক সূচক তৈরি করা সাধারণত আরও দক্ষ query যা বজায় রাখতে সস্তা, ছোট, দ্রুত এবং ক্যোয়ারির শর্তটি মিলে গেলে আরও সহজেই ব্যবহৃত হয়।

যদি আপনার কাছে অনেকগুলি প্রশ্ন রয়েছে auto_renew IS NULLযা দিয়ে সারি সন্ধান করছে এবং কেসটি NULLখুব সাধারণ না হয় (এবং / অথবা আপনার একটি নির্দিষ্ট ক্রমের প্রয়োজন হয়) তবে এই সূচকগুলি এই সারিগুলি দ্রুত সন্ধান / সজ্জিত করতে সহায়তা করবে:

CREATE INDEX index_tbl_tbl_id_auto_renew_null ON tbl (tbl_id)
WHERE auto_renew IS NULL;

আংশিক সূচকের শর্তটি WHEREক্যোয়ারির পরিকল্পনাকারীকে সূচকটি প্রযোজ্য তা উপলব্ধি করতে আরও কম-বেশি কোনও প্রশ্নের ক্লাসে পুনরাবৃত্তি করতে হবে ।

সূচকযুক্ত কলাম ( tbl_id) একটি স্বেচ্ছাসেবী বাছাই। গুরুত্বপূর্ণ অংশটি হচ্ছে WHEREধারা। এই বিশেষ সূচকের সাথে প্রশ্নের জন্য সবচেয়ে কার্যকর হবে ORDER BY tbl_idবা বা একটি অতিরিক্ত ফিল্টার এ যোগ tbl_id। আপনি এটিকে একটি বহু-কলাম সূচি তৈরি করতে পারেন । বুলিয়ান কলামগুলি অন্যদের সাথে প্রায়শই বেশি কার্যকর।

পাশে: ওআরএমগুলি ক্র্যাচগুলি যা নিয়মিত আপনার আরডিবিএমএস থেকে সম্পূর্ণ সম্ভাব্যতা অর্জন করতে ব্যর্থ হয়।


উজ্জ্বল উত্তর, আপনাকে ধন্যবাদ আমি দু: খিত আমি এটিকে দু'বার উপড়ে ফেলতে পারি না।
সিমোন কার্লেটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.