মাল্টিকোলোম সূচক এবং কর্মক্ষমতা


31

আমার কাছে একটি বহুবিধ সূচকযুক্ত একটি টেবিল রয়েছে এবং ক্যোয়ারিতে সর্বাধিক পারফরম্যান্স পাওয়ার জন্য সূচীর যথাযথ বাছাই সম্পর্কে আমার সন্দেহ আছে।

দৃশ্য:

  • পোস্টগ্রিসকিউএল 8.4, প্রায় এক মিলিয়ন সারি সহ টেবিল

  • কলামে মানগুলি C1 সম্পর্কে থাকতে পারে 100 মান আলাদা । আমরা ধরে নিতে পারি যে মানগুলি সমানভাবে বিতরণ করা হয়েছে, সুতরাং প্রতিটি সম্ভাব্য মানের জন্য আমাদের কাছে প্রায় 10000 সারি রয়েছে।

  • কলাম C2 থাকতে পারে 1000 মান আলাদা । আমাদের প্রতিটি সম্ভাব্য মানের জন্য 1000 সারি রয়েছে।

ডেটা অনুসন্ধান করার সময়, শর্তটিতে সর্বদা এই দুটি কলামের মান অন্তর্ভুক্ত থাকে, সুতরাং সারণীতে সি 1 এবং সি 2 সংযুক্ত একটি মাল্টিকালম ইনডেক্স রয়েছে। ফিল্টারিংয়ের জন্য যদি কেবল একটি কলাম ব্যবহার করে আপনার কাছে প্রশ্ন থাকে তবে আমি মাল্টিকালম ইনডেক্সে কলামগুলি সঠিকভাবে অর্ডার করার গুরুত্ব সম্পর্কে পড়েছি । আমাদের পরিস্থিতিতে এটি হয় না।

আমার প্রশ্ন এই এক:

ফিল্টারগুলির মধ্যে একটি থেকে অনেক ছোট ডেটা নির্বাচন করা হয় তা প্রমাণ করে, যদি প্রথম সূচকটি সর্বাধিক নির্বাচিত হয় (যেটি একটি ছোট সেটকে অনুমতি দেয়) তবে আমি কি পারফরম্যান্স উন্নত করতে পারি? রেফারেন্সকৃত নিবন্ধ থেকে গ্রাফিক্স না পাওয়া পর্যন্ত আমি এই প্রশ্নটি কখনই বিবেচনা করি নি:

এখানে চিত্র বর্ণনা লিখুন

মাল্টিকালম ইনডেক্স সম্পর্কে রেফারেন্স করা নিবন্ধ থেকে তোলা চিত্র ।

প্রশ্নগুলি ফিল্টারিংয়ের জন্য দুটি কলামের মান ব্যবহার করে। ফিল্টারিংয়ের জন্য আমার কেবল একটি কলাম ব্যবহার করার কোনও প্রশ্ন নেই। তাদের সমস্ত আছেন: WHERE c1=@ParameterA AND c2=@ParameterB। এর মতো শর্তও রয়েছে:WHERE c1 = "abc" AND c2 LIKE "ab%"

উত্তর:


36

উত্তর

আপনি যেহেতু ওয়েবসাইটটি উল্লেখ করেছেন use-the-index-luke.com, অধ্যায়টি বিবেচনা করুন:

সূচক, লূক Where দ্য ক্লজ ›রেঞ্জের সন্ধান› আরও বৃহত্তর, কম এবং আরও

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

Rule of thumb: index for equality first  then for ranges.

শুধুমাত্র একটি কলামের জন্যও ভাল?

শুধুমাত্র একটি কলামে প্রশ্নের জন্য কী করা উচিত তা পরিষ্কার বলে মনে হচ্ছে। এই সম্পর্কিত প্রশ্নের অধীনে এ সম্পর্কিত আরও বিশদ এবং মানদণ্ড:

প্রথমে কম নির্বাচনী কলাম?

তা ছাড়া, যদি আপনার উভয় কলামের জন্য কেবল সমতার শর্ত থাকে ?

এটা কোন ব্যাপার না । কলামটি আগে রাখুন যা তার নিজের অবস্থার প্রাপ্তির বেশি সম্ভাবনা রয়েছে যা আসলে গুরুত্বপূর্ণ।

এই ডেমোটি বিবেচনা করুন বা এটি নিজেই পুনরুত্পাদন করুন। আমি 100k সারি দিয়ে দুটি কলামের একটি সাধারণ টেবিল তৈরি করি। একটি খুব কম সংখ্যক , অন্যটি প্রচুর স্বতন্ত্র মান সহ:

CREATE TEMP TABLE t AS
SELECT (random() * 10000)::int AS lots
     , (random() * 4)::int     AS few
FROM generate_series (1, 100000);

DELETE FROM t WHERE random() > 0.9;  -- create some dead tuples, more "real-life"

ANALYZE t;

SELECT count(distinct lots)   -- 9999
     , count(distinct few)    --    5
FROM   t;

প্রশ্ন:

SELECT *
FROM   t
WHERE  lots = 2345
AND    few = 2;

EXPLAIN ANALYZE আউটপুট (ক্যাচিং প্রভাবগুলি বাদ দেওয়ার জন্য সেরা 10):

টিতে সিক স্ক্যান (ব্যয় = 0.00..5840.84 সারি = 2 প্রস্থ = 8)
               (প্রকৃত সময় = 5.646..15.535 সারি = 2 লুপ = 1)
  ফিল্টার: ((প্রচুর = 2345) এবং (কয়েকটি = 2))
  বাফার্স: স্থানীয় হিট = 443
মোট রানটাইম: 15.557 এমএস

সূচক যুক্ত করুন, পরীক্ষা করুন:

CREATE INDEX t_lf_idx ON t(lots, few);
টি তে t_lf_idx ব্যবহার করে সূচক স্ক্যান (ব্যয় = 0.00..3.76 সারি = 2 প্রস্থ = 8)
                                (প্রকৃত সময় = 0.008..0.011 সারি = 2 লুপ = 1)
  সূচকের অবস্থা: ((প্রচুর = 2345) এবং (কয়েকটি = 2)
  বাফার্স: স্থানীয় হিট = 4
মোট রানটাইম: 0.027 এমএস

অন্যান্য সূচক যুক্ত করুন, পরীক্ষা করুন:

DROP INDEX t_lf_idx;
CREATE INDEX t_fl_idx  ON t(few, lots);
টি তে t_fl_idx ব্যবহার করে সূচক স্ক্যান (ব্যয় = 0.00..3.74 সারি = 2 প্রস্থ = 8)
                                (প্রকৃত সময় = 0.007..0.011 সারি = 2 লুপ = 1)
  সূচকের অবস্থা: ((কয়েকটি = 2) এবং (প্রচুর = 2345)
  বাফার্স: স্থানীয় হিট = 4
মোট রানটাইম: 0.027 এমএস

সূচীতে 3 (বা আরও) কলামগুলির ক্ষেত্রেও এটি কি?
হেড

@ হাইদ: "এটি" কী বোঝায় তা নিশ্চিত নয়। আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন । আপনি সর্বদা প্রসঙ্গে এইটিকে উল্লেখ করতে পারেন। (এবং এখানে ফিরে লিঙ্ক করতে একটি মন্তব্য ড্রপ।)
এরউইন ব্র্যান্ডসেটেটার

"এই" মানে "সূচী সংজ্ঞায় 2 টিরও বেশি কলাম থাকলে" সূচক সংজ্ঞাটি
অর্ডার করে

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

ধন্যবাদ, আমি চেষ্টা করব এবং একটি সুসংগত প্রশ্ন লিখব এবং এর সাথে লিঙ্ক করব।
হাইড

11

যদি আপনি যেমনটি বলেন, এই 2 টি কলামের সাথে সম্পর্কিত অনুসন্ধানগুলি উভয় কলামের সমস্ত সমতা চেক হয়, যেমন:

WHERE c1=@ParameterA AND c2=@ParameterB

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

সূচকের অভ্যন্তরের আদেশটি অন্যান্য ধরণের প্রশ্নের জন্য বিবেচিত হবে, কেবল একটি কলামের চেক, বা অসমতার শর্ত, বা একটি কলামে শর্ত এবং অন্যটিতে গ্রুপিং ইত্যাদি would

আমি যদি দুটি অর্ডারগুলির মধ্যে একটি চয়ন করতে চাই, তবে আমি প্রথমে কম নির্বাচনী কলামটি বেছে নেব । কলাম yearএবং একটি টেবিল বিবেচনা করুন month। আপনার আরও বেশি WHERE year = 2000শর্ত রয়েছে যে আপনার একটি শর্ত বা একটি WHERE year BETWEEN 2000 AND 2013বা একটি দরকার WHERE (year, month) BETWEEN (1999, 6) AND (2000, 5)

প্রকারের একটি ক্যোয়ারী WHERE month = 7 GROUP BY yearনিশ্চিতভাবে চাওয়া হতে পারে (জুলাই জন্মগ্রহণকারী লোকদের সন্ধান করুন), তবে প্রায়শই কম হবে। এটি অবশ্যই আপনার টেবিলে সঞ্চিত প্রকৃত ডেটার উপর নির্ভর করে। আপাতত একটি অর্ডার চয়ন করুন, বলুন (c1, c2)এবং আপনি পরে সর্বদা অন্য সূচক যুক্ত করতে পারেন (c2, c1)


ওপি'র মন্তব্যের পরে আপডেট করুন:

এর মতো শর্তও রয়েছে: WHERE c1 = 'abc' AND c2 LIKE 'ab%'

এই ধরণের ক্যোয়ারী যদি c2কলামে হুবহু একটি পরিসরের শর্ত এবং একটি (c1, c2)সূচকের প্রয়োজন হয় need আপনার যদি বিপরীত প্রকারের প্রশ্ন থাকে:

WHERE c2 = 'abc' AND c1 LIKE 'ab%'

তাহলে ভাল হবে যদি আপনারও একটি (c2, c1)সূচক থাকে।

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