PostgreSQL এর সূচিগুলিতে নাল ব্যবহার করতে পারে?


10

আমি এই বইটি পড়ছি যা বলে

ডাটাবেসটি ধরে নিয়েছে যে সূচিযুক্ত_ কলটি দরকারী হওয়ার জন্য খুব বড় পরিসীমাটিকে কভার করে না, তাই এই শর্ত থেকে ডাটাবেস কোনও সূচকে চালিত করবে না।

আমি বুঝতে পারি যে বইটি 10 ​​বছরেরও বেশি পুরানো, তবে এটি ইতিমধ্যে বেশ কার্যকর প্রমাণিত হয়েছে - এর পৃষ্ঠাগুলি থেকে নির্দেশাবলী ব্যবহার করে, আমি দশটির একটি ফ্যাক্টর দিয়ে একটি প্রশ্ন অনুসন্ধান করেছি।

তদুপরি, EXPLAIN ANALYZEএকটি SELECTঅনুসন্ধান চালানোর সময় , আমি খুঁজে পেয়েছি যে আমার সূচিগুলির কোনওটিই ব্যবহার করা হচ্ছে না, এমনকি সমস্ত অধিকারের দ্বারা, তাদের হওয়া উচিত।

সুতরাং, আমার প্রশ্নটি হ'ল:

মনে করুন যে কোনও টেবিল রয়েছে যার একটি কলাম রয়েছে, যার কলাম সংজ্ঞাটিতে "নট নুল" নেই এবং এই সূচকটি উপস্থিত রয়েছে যা এই কলামটি জুড়েছে, এই সূচিটি কি সেই টেবিলের কোয়েরিতে ব্যবহৃত হবে যেখানে কলামগুলি কোয়েরির অংশ?

ভালো লেগেছে:

CREATE TABLE my_table(
a varchar NOT NULL
);

CREATE INDEX ix_my_table ON my_table(a);

SELECT a from my_table;

উত্তর:


9

PostgreSQL অবশ্যই এর জন্য একটি সূচক ব্যবহার করতে পারে IS NOT NULL। সেই শর্তটি সম্পর্কে আমি কোনও ক্যোয়ার পরিকল্পনাকারী অনুমান দেখি না।

যদি কলামের ( pg_statistic.stanullfrac) কলের জন্য নাল ভগ্নাংশটি প্রস্তাবিত করার মতো পর্যাপ্ত পরিমাণে থাকে তবে সূচকটি ক্যোয়ারির জন্য কার্যকরভাবে নির্বাচিত হয়েছে, পোস্টগ্রেএসকিউএল একটি সূচক ব্যবহার করবে।

আপনি কী বলতে চাইছেন তা আমি বুঝতে পারি না:

যদি এটি সঠিক হয় তবে আমার বুঝতে পারছেন যে "ক্যান্ট নাল নয়" হিসাবে সংজ্ঞায়িত কলামে একটি সূচক যে কলামটি ব্যবহার করে এমন কোয়েরিতে ব্যবহার করা হবে না?

অবশ্যই কোনও কলামে কোনও IS NOT NULLশর্তের জন্য কোনও সূচক ব্যবহার করা হবে না NOT NULL। এটি সর্বদা 100% সারির সাথে মিলবে, তাই সিক্স্যান স্ক্যান প্রায় সবসময়ই আরও দ্রুত হয়।

যদি সূচী কোনও প্রশ্নের জন্য সারিগুলির একটি বৃহত অনুপাতকে ফিল্টার করে না তবে পোস্টগ্রিজ এসকিউএল কোনও সূচক ব্যবহার করবে না। একমাত্র সম্ভাব্য ব্যতিক্রম হ'ল যখন আপনি কোনও একক সূচকের আওতায় থাকা কলামগুলির একটি সেট চাইছেন, যাতে সূচকের সাথে মিলছে। পোস্টগ্রিএসকিউএল তখন কেবল সূচি-স্ক্যান করতে পারে। যেমন যদি কোনও সূচক থাকে t(a, b, c)এবং আপনি:

select a, b FROM t ORDER BY a, b, c;

পোস্টগ্রিএসকিউএল আপনার সূচকগুলি ব্যবহার করতে পারে, যদিও কোনও সারি ফিল্টার না করা হয়, কারণ এটি কেবল সূচিটি পড়তে হয় এবং হিপ পড়া বাদ দিতে পারে, বাছাই করা এড়ানো ইত্যাদি avoid



1
এমনকি একটি অবিচ্ছিন্ন কলামেও শর্তযুক্ত একটি কোয়েরি WHERE column IS NOT NULLসূচকটি ব্যবহার করতে পারে না কারণ বইটি যেমন বলে: "দরকারী হওয়ার জন্য অনেক বড় পরিসীমা আবরণ করা হয়েছে"। যদি 90% মানগুলি শূন্য না হয় তবে একটি সেকশন সম্ভবত খুব দ্রুত হবে।
ypercubeᵀᴹ

যথাযথভাবে। এটি হতে পারে তবে কেবল যদি টেবিলের একটি বৃহত ভগ্নাংশ শূন্য থাকে। প্রায়শই এই ক্ষেত্রে একটি আংশিক সূচক যাইহোক ভাল পছন্দ।
ক্রেগ রিঞ্জার

হ্যাঁ. আমি বলার চেষ্টা করছিলাম যে (আমি এটি বুঝতে পেরেছি) অংশটি "খুব বড় একটি পরিসীমা জুড়ে" অংশটি সূচককে বোঝায় তবে নির্দিষ্ট অবস্থার সাথে সম্পর্কিত এবং সাধারণভাবে সূচককে নয়।
ypercubeᵀᴹ

2
@ ফিউরিয়াসফোল্ডার হেই, এখানে অনেকগুলি অবহেলা রয়েছে। পোস্টগ্রিএসকিউএল NOT NULLকোনও IS NOT NULLক্যোয়ারির জন্য কোনও কলামে একটি সূচক ব্যবহার করবে না যদি না যে সূচকটি WHEREধারাটির অন্যান্য অংশগুলির জন্যও কার্যকর হয় , ফিল্টারগুলিতে যোগ দিতে পারে ইত্যাদি, বা কেবল আদেশিত সূচক-স্ক্যানের জন্য ব্যবহারযোগ্য না হয়। অন্য কথায়, এটি সম্পূর্ণ অপ্রয়োজনীয় উপেক্ষা করব IS NOT NULLউপর NOT NULLকলাম করুন এবং সূচক ব্যবহার অন্যান্য বিবরণ উপর ভিত্তি করে বিকল্পের। (সম্পাদনা দেখুন, কেবল সূচি-শুধুমাত্র স্ক্যানগুলি দেখুন)।
ক্রেগ রিঞ্জার

2

ক্রেগের পুরো উত্তর ছাড়াও, আমি যুক্ত করতে চেয়েছিলাম যে আপনি উল্লেখ করেছেন বইয়ের কভারটি:

ওরাকল, ডিবি 2 এবং এসকিউএল সার্ভারকে কভার করে

সুতরাং আমি এটি বিশেষত পোস্টগ্রাইএসকিউএল-তে পরামর্শের একটি দুর্দান্ত উত্স বলে বিশ্বাস করব না। প্রতিটি আরডিবিএমএস আশ্চর্যজনকভাবে আলাদা হতে পারে!

আমি আপনার আসল প্রশ্নটি সম্পর্কে কিছুটা বিভ্রান্ত, তবে এখানে একটি উদাহরণ যা বইয়ের এই বিভাগটি 100% সঠিক নয়। আরও বিভ্রান্তি এড়াতে, এখানে পুরো প্রাসঙ্গিক অনুচ্ছেদটি আপনি এটি গুগল বুক অনুসন্ধানে দেখতে পারেন ।

ডাটাবেসটি ধরে নিয়েছে যে সূচিযুক্ত_ কলটি দরকারী হওয়ার জন্য খুব বড় পরিসীমাটিকে কভার করে না, তাই এই শর্ত থেকে ডাটাবেস কোনও সূচকে চালিত করবে না। বিরল ক্ষেত্রে, কোনও ননল মূল্য থাকা এত বিরল যে সমস্ত সম্ভাব্য ননাল মানগুলির চেয়ে একটি সূচক পরিসীমা স্ক্যান উপকারী। এই জাতীয় ক্ষেত্রে, আপনি যদি সমস্ত সম্ভাব্য মানের সীমার কোনও নিরাপদ নিম্ন বা উচ্চতর সীমা নির্ধারণ করতে পারেন তবে আপনি পজিটিভ_আইডি_কলাম> -1 বা তারিখ_কলাম> TO_DATE ('0001/01/01' এর মতো একটি শর্ত দিয়ে একটি রেঞ্জ স্ক্যান সক্ষম করতে পারেন ' , 'ওয়াইওয়াই / এমএম / ডিডি')।

পোস্টগ্র্যাগস আসলে (নীচের স্বীকৃত ক্ষেত্রে) IS NOT NULLপ্রস্তাবিতের মতো পরিসীমা স্ক্যান ক্লডজ যুক্ত না করে প্রশ্নগুলি সন্তুষ্ট করতে একটি সূচক ব্যবহার করতে পারে Positive_ID_Column > -1। এই বিশেষ ক্ষেত্রে পোস্টগ্র্রেস কেন এই সূচিটি বেছে নিচ্ছে তার জন্য ক্রেগের প্রশ্নের মন্তব্যসমূহ এবং আংশিক সূচকগুলি ব্যবহার সম্পর্কে নোট দেখুন।

CREATE TABLE bar (a int);
INSERT INTO bar (a) SELECT NULL FROM generate_series(1,1000000);
INSERT INTO bar (a) VALUES (1);
CREATE INDEX bar_idx ON bar (a);

EXPLAIN ANALYZE SELECT * FROM bar WHERE a IS NOT NULL;
                                                QUERY PLAN                                                    
------------------------------------------------------------------------------------------------------------------
 Index Only Scan using bar_idx on bar  (cost=0.42..8.44 rows=1 width=4) (actual time=0.094..0.095 rows=1 loops=1)
   Index Cond: (a IS NOT NULL)
   Heap Fetches: 1
 Total runtime: 0.126 ms
(4 rows)

এটি পোস্টগ্র্রেস 9.3, যাইহোক, তবে আমি বিশ্বাস করি ফলাফলগুলি 9.1-তে প্রায় সমান হবে, যদিও এটি "সূচক কেবলমাত্র স্ক্যান" ব্যবহার করবে না।

সম্পাদনা: আমি দেখতে পাচ্ছি যে আপনি আপনার মূল প্রশ্নটি স্পষ্ট করেছেন, এবং আপনি আপাতভাবে ভাবছেন যে পোস্টগ্র্রেস কেন সরল উদাহরণে সূচকটি ব্যবহার করছে না:

CREATE TABLE my_table(
a varchar NOT NULL
);

CREATE INDEX ix_my_table ON my_table(a);

SELECT a from my_table;

সম্ভবত টেবিলে আপনার কোনও সারি নেই। সুতরাং কিছু পরীক্ষার ডেটা যুক্ত করুন এবং ANALYZE my_table;


উক্ত গ্রন্থটির (জোর দিয়ে আমার) বিবরণে: " এসকিউএল বা ডাটাবেস প্ল্যাটফর্মটি যেভাবে ব্যবহৃত হচ্ছে তার জটিলতা নির্বিশেষে, লেখক ড্যান টো অনুকূল ও কার্যকর পরিকল্পনার সন্ধানের জন্য তিনি তৈরি করেছেন এমন একটি সময়সীমার পদ্ধতিটির রূপরেখা প্রকাশ করেছেন " এছাড়াও, সম্ভবত আপনি প্রশ্নের # 1 উপেক্ষা করেছেন, যথা, কলামটি হিসাবে সংজ্ঞায়িত করা হয়েছে NOT NULL, কোয়েরিটি IS NOT NULLতার সূচক শর্ত হিসাবে ব্যবহার করে না । এটি আপনার উল্লেখ করা মন্তব্যে রয়েছে তবে আমি এটিকে অন্তর্ভুক্ত করার জন্য প্রশ্নটি আপডেট করব।
ফিউরিয়াসফোল্ডার

তদুপরি, বইটি নিজেই ভাষা অজ্ঞেয়বাদী: একমাত্র ডিএমবিএস-নির্দিষ্ট অংশগুলি কোয়েরি পরিকল্পনাগুলি দেখানোর বিষয়ে যা
পোস্টগ্র্রেস

1
@ ফিউরিয়াসফোল্ডার কলামটি নুল নাল হিসাবে সংজ্ঞায়িত করা হয়েছে তবে এই অংশটি (আপনার প্রশ্নে, বইটি থেকে): "যে সূচী_আরঙ্কটি নুল কভার করে না ..." সেখানে কলামের সংজ্ঞা নয় যেখানে অবস্থার উল্লেখ করছে। যদিও এটি নিশ্চিত করা শক্ত, কারণ এটি প্রসঙ্গের বাইরে। সম্ভবত আপনি বই থেকে পুরো (পূর্ববর্তী) অনুচ্ছেদ অন্তর্ভুক্ত করা উচিত।
ypercubeᵀᴹ

-1

আপনি আপনার ক্যোয়ারী বা উদাহরণ ডেটা পোস্ট করেন নি। তবে সূচকগুলি ব্যবহার না করা সবচেয়ে সাধারণ কারণটি ভলিউমের সাথে সম্পর্কিত।

সূচকগুলি এমন একটি ফোনবুকের মতো যা একটি কলামকে একটি সারি স্থানে অনুবাদ করে। যদি আপনি কেবল কয়েকটি সারি সন্ধান করেন তবে ফোনবুকের প্রতিটি সারিটি অনুসন্ধান করা এবং তারপরে মূল সারণীতে সারিটি সন্ধান করা বুদ্ধিমান হয়ে উঠবে।

তবে কয়েকটি সারির বেশিের জন্য, ফোনবুকটি এড়ানো সস্তা এবং মূল টেবিলের সমস্ত সারিতে পুনরাবৃত্তি করা সস্তা। আমার অভিজ্ঞতায় টিপিং পয়েন্টটি প্রায় 100 টি সারি।


"সূচীগুলি এমন একটি ফোনবুকের মতো যা একটি কলামকে একটি সারি স্থানে অনুবাদ করে। প্রকৃতপক্ষে, সূচিগুলি ছোট ফোনবুকগুলির মতো যা তারা যে সূচক ফোনবুক আপডেট করে তা আপডেট হয়। আপনি জানেন যে যে কোনও সময় আপনি একটি ছোট ফোনবুক খুলুন, আপনি তার সূচক অবস্থার বর্ণনা করে এমন কোনও এবং সমস্ত তথ্য সন্ধান করতে যাচ্ছেন। যেমন সকল ব্যক্তি একটি সূচক টেবিলের উপর নামে 'অকপট': CREATE INDEX ix_frank ON people(name) WHERE name ='frank'
ফিউরিয়াসফোল্ডার

এর ফলে একটি সূচক শুধুমাত্র হতে স্ক্যান অনেক অনেক যেহেতু আপনি মেমরিতে সমগ্র "ছোট ফোনবুক", যা একটি মাল্টি মিলিয়ন রেখাযুক্ত টেবিলের সাথে সম্ভবপর নয় পড়তে পারেন, দ্রুত।
ফিউরিয়াসফোল্ডার

@ ফিউরিয়াসফোল্ডার: আপনি কেবল একটি সূচক-স্ক্যানের বিবরণ দিচ্ছেন। তবে ওপি বলেছে যে তার সূচকগুলি ব্যবহার হচ্ছে না, যা কেবলমাত্র কোনও সূচক-স্ক্যানের সাহায্যে কোয়েরিটি পূরণ করবে happen
Andomar

Andomar ... আমি আছি ওপি, হা হা। আমার লক্ষ্য ঠিক সেটাই; কেবলমাত্র একটি সূচক স্ক্যান ব্যবহার করতে এই ক্যোয়ারীটি পেতে। আমি যেহেতু এটি অর্জন করেছেন, যেহেতু ক্রেইগ ব্যাখ্যা করেছেন যে postgres হয় একটি কলাম যেখানে কলাম সংজ্ঞা অন্তর্ভুক্ত উপর একটি সূচক ব্যবহার করতে পারবেন NOT NULL
FuriousFolder
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.