কীভাবে field WHIE ক্ষেত্রটি NULL` দিয়ে কোনও ক্যোয়ারী সূচক করবেন?


14

আমার কাছে প্রচুর সন্নিবেশ সহ একটি টেবিল রয়েছে, যা ক্ষেত্রগুলির একটি ( uploaded_at) এ সেট করে NULL। তারপরে একটি পর্যায়ক্রমিক টাস্ক সমস্ত টিপল নির্বাচন করে WHERE uploaded_at IS NULL, সেগুলি প্রসেস করে এবং uploaded_atবর্তমান তারিখে সেট করে আপডেট করে ।

আমি টেবিলটি কীভাবে সূচক করব?

আমি বুঝতে পারি যে আমার মতো আংশিক সূচি ব্যবহার করা উচিত:

CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL

বা স্মেথ যে। আমি একটু যদিও বিভ্রান্ত যদি এটি একটি ক্ষেত্র সর্বদা যে সূচক সঠিক আছি NULL। বা বি-ট্রি সূচক ব্যবহার করা যদি সঠিক হয়। হ্যাশটি আরও ভাল ধারণার মতো দেখায় তবে এটি অপ্রচলিত এবং হট স্ট্যান্ডবাইয়ের প্রতিরূপ স্ট্রিমিংয়ের মাধ্যমে প্রতিলিপি করা হয় না। যেকোন উপদেশ সাদরে গ্রহণ করা হবে।

আমি নিম্নলিখিত সূচকগুলির সাথে কিছুটা পরীক্ষা করেছি:

"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL

এবং ক্যোয়ারির পরিকল্পনাকারী মনে হয় সবসময় সূচিটি বেছে নেয় foo_part। সূচকের explain analyseজন্য কিছুটা ভাল ফলাফলও পাওয়া যায় foo_part:

Index Scan using foo_part on t1  (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
   Index Cond: (uploaded_at IS NULL)
 Total runtime: 4.060 ms

বনাম

Bitmap Heap Scan on t1  (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
   Recheck Cond: (uploaded_at IS NULL)
   ->  Bitmap Index Scan on foo_part_id  (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
 Total runtime: 5.131 ms

উত্তর:


10

এই বিশেষ ক্ষেত্রে প্রকৃত সূচিযুক্ত কলামটি হাতের প্রশ্নের জন্য অপ্রাসঙ্গিক। আপনি যে কোনও কলাম চয়ন করতে পারেন। আমি ব্যতীত অন্য কিছু বেছে নেব uploaded_at, যা অকেজো। কিছু কলাম যা অন্যান্য প্রশ্নের জন্য কার্যকর হতে পারে এবং আদর্শভাবে 8 বাইটের চেয়ে বড় নয়।

CREATE INDEX foo ON table bar (some_col) WHERE uploaded_at IS NULL;

অন্য কোনও কলামের জন্য আপনার যদি ব্যবহারের কেস না থাকে তবে অকেজোদের সাথে আঁকড়ে থাকাই ভাল uploaded_at, তাই সূচকের জন্য অতিরিক্ত রক্ষণাবেক্ষণ ব্যয় এবং এইচওটি আপডেটের জন্য বিধিনিষেধের প্রবর্তন না করা। আরও:

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

CREATE INDEX baz ON table bar ((TRUE)) WHERE uploaded_at IS NULL;

প্যারেন্টিসেস প্রয়োজন। এটি সূচকে ন্যূনতম আকারে রাখে। তবে সূচক কলামটি কখনই 8 বাইটের চেয়ে বড় নয় (এটি ক্ষেত্রে timestamp) এটি এখনও ন্যূনতম আকারে রয়েছে। সম্পর্কিত:


এটি idউদাহরণস্বরূপ একটি সিরিয়াল ক্ষেত্র হতে পারে ?
কিরিল জায়টসেভ

1
@ টিফেরি: এ যে কোনও serialহিসাবে ভাল। মূল বিষয়টি এটির ব্যবহার করতে আসলে প্রশ্ন রয়েছে কিনা।
এরউইন ব্র্যান্ডসটেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.