একটি যৌগিক সূচক কি প্রথম ক্ষেত্রের প্রশ্নের জন্য ভাল?


86

ধরা যাক আমার সাথে ক্ষেত্র Aএবং একটি টেবিল রয়েছে B। আমি A+ এ নিয়মিত প্রশ্ন Bকরি, তাই আমি একটি সম্মিলিত সূচক তৈরি করেছি (A,B)। কেবলমাত্র অনুসন্ধানগুলি কি Aসংমিশ্র সূচক দ্বারা সম্পূর্ণরূপে অনুকূলিত হবে?

অতিরিক্ত হিসাবে, আমি এতে একটি সূচক তৈরি করেছি A, তবে পোস্টগ্রিস এখনও কেবলমাত্র প্রশ্নের জন্য সম্মিলিত সূচক ব্যবহার করে A। পূর্ববর্তী উত্তরটি যদি ইতিবাচক হয় তবে আমি অনুমান করি এটি সত্যিই কিছু যায় আসে না, তবে কেন এটি একক Aসূচক উপলভ্য থাকলে ডিফল্টরূপে এটি যৌগিক সূচকটি বেছে নেয় ?


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

@ ডিজেসো আকর্ষণীয়। প্রতিটি প্রশ্নের জন্য কোথায় খরচ হয়?
লুসিয়ানো

বিটম্যাপ সূচক স্ক্যানের ব্যয়: 107.98, 43 এমএস সম্পাদনের সময়। সূচি স্ক্যান ওয়ান-কলাম: 8.69, দ্বি-কলাম: 43.69। মৃত্যুদন্ড কার্যকর করার সময়গুলি উল্লেখযোগ্যভাবে পৃথক হয় না (দুটির মধ্যে পার্থক্যের তুলনায় ওঠানামা বড় হয়)।
dezso

@ লুসিয়ানো আপনি কি explain analyzeএবং ক্যোয়ারী পাঠ্যটি দেখাতে পারবেন ?
ক্রেগ রিঞ্জার

উত্তর:


88

এটা অবশ্যই. আমরা এই সম্পর্কিত প্রশ্নের অধীনে এটিকে বিস্তারিতভাবে আলোচনা করেছি:

স্পেসটি বহুগুণে বরাদ্দ করা হয় MAXALIGN, যা 64৪-বিট ওএসে সাধারণত 8 বাইট বা 32-বিট ওএসের 4 বাইট (খুব কম সাধারণ) হয়। আপনি যদি নিশ্চিত না হন তবে পরীক্ষা করুন pg_controldata। এটি ইনডেক্সড কলামগুলির ডেটা ধরণের উপর নির্ভর করে (কিছুকে অ্যালাইনমেন্ট প্যাডিং প্রয়োজন) এবং প্রকৃত সামগ্রী content

অনুলিপিটি বলুন, দুটি integerকলাম (প্রতিটি 4 বাইট) সাধারণত একটির সূচকের মতো ঠিক বড় হয়ে যায়, যেখানে আরও 4 বাইট বিন্যাস প্যাডিংয়ের সাথে হারিয়ে যায়।

এই জাতীয় ক্ষেত্রে ক্যোয়ারী পরিকল্পনাকারীর পক্ষে কোনও সূচক ব্যবহার করার পক্ষে আসলে কোনও খারাপ দিক নেই (a,b)- কেবলমাত্র একটি সূচকের তুলনায় (a)। এবং একই সূচকটি ব্যবহার করা একাধিক প্রশ্নের পক্ষে সাধারণত পছন্দনীয়। এটির (বা এর কিছু অংশ) ভাগ (ভাগ করা) ক্যাশে থাকার সুযোগ বেড়ে যায় shared

যদি আপনি ইতিমধ্যে সূচক বজায় রাখেন (a,b)তবে তা অন্যদিকে কেবল অন্য সূচি তৈরি করা বুদ্ধিমান হবে (a)না - যদি না এটি যথেষ্ট পরিমাণে ছোট হয়। একই না জন্য সত্য (b,a)বনাম (a)। এটির জন্য আরও প্রথম লাইনে লিঙ্কটি অনুসরণ করুন।

বিপরীত দিক থেকে আগত, যখন আপনার যখন এর মতো অতিরিক্ত সূচক দরকার হয় (a,b), তখন একটি বিদ্যমান সূচকটি কেবলমাত্র ছেড়ে দেওয়ার বিষয়ে বিবেচনা করুন (a)- সম্ভব হলে। এটি পিকে বা UNIQUEসীমাবদ্ধতার সূচক হিসাবে প্রায়শই সম্ভব হয় না । পোস্টগ্রেস 11 যেহেতু আপনি কেবল bতার INCLUDEপরিবর্তে ক্লজটির সাথে সীমাবদ্ধতার সংজ্ঞা সংযোজন করে পালিয়ে যেতে পারেন । ম্যানুয়ালটিতে বিশদ।

অথবা(b,a) কেবল bঅতিরিক্তভাবে প্রশ্নগুলি কভার করার পরিবর্তে নতুন সূচক তৈরি করুন । শুধুমাত্র সাম্যতার শর্তে বিটি সূচকগুলিতে সূচক এক্সপ্রেশনগুলির ক্রমটি বিবেচনা করে না। এটি পরিসীমা শর্ত জড়িত যখন, না। দেখা:

আছে সম্ভাব্য মূল্যবান এমনকি যদি যে শুধুমাত্র স্থান অন্যথায় প্রান্তিককরণ প্যাডিং কাছে পরাজিত ব্যবহার করে, একটি সূচক অতিরিক্ত কলাম সহ:

  • যখনই অতিরিক্ত কলাম আপডেট করা হয়, সূচকের এখন একটি আপডেটও প্রয়োজন, যা ক্রিয়াকলাপ লেখার জন্য আরও সংযোজন করতে পারে এবং আরও সূচক ব্লাট তৈরি করতে পারে।
  • কোনও সূচী কলাম জড়িত থাকার সময় টেবিলের HOT আপডেটগুলি (হিপ ওল টুপল) সম্ভব নয় ।

হট আপডেটে আরও:

কীভাবে বস্তুর আকার মাপতে হবে:


1
আপনি কি এটি বলতে বাড়াতে পারেন, কলাম ক এ আমার একটি সূচক আছে এবং একটি যৌগিক সূচক (এ, বি) যুক্ত করার প্রয়োজন দেখা দিলে সূচক এ বাদ দেওয়া উচিত? যদি কোনও সূচকে পুনরায় ব্যবহার করা ক্যাশে দক্ষতা উন্নত করে এবং (এ, বি) পুরোপুরি অনুকূল করে, এ, তবে মনে হয় এটির উপরে অতিরিক্ত সূচকটি স্থান নষ্ট করবে এবং সম্ভাব্য জিনিসগুলি ধীর করবে
jvans

1
@ জভানস: সাধারণত সত্য - উল্লেখযোগ্য ব্যতিক্রম এবং বিকল্প সহ। আমি এটিকে সম্বোধন করার জন্য একটি অনুচ্ছেদ যুক্ত করেছি।
এরউইন ব্র্যান্ডসটেটার

2

আপনার প্রশ্ন অনুসারে আপনার ক্ষেত্র এ এবং বি সহ একটি টেবিল রয়েছে যদি আপনি আপনার প্রশ্নটি হ'ল:

SELECT * FROM [YOUR TBL]
WHERE A='XXXX'

অপ্টিমাইজারটি এলোমেলো এলোমেলো অ্যাক্সেস এড়াতে কমপোজিট সূচকটি বেছে নেবে!


-4

আপনি যদি প্রিডিকেটে প্রথমটি ব্যবহার করেন তবে এটি ক্ষেত্রে।

আপনি যদি সম্মিলিত কী এর প্রথম কলাম এবং সংমিশ্র কীটির নন-কী কলামটি ব্যবহার করেন তবে এটি স্ক্যান করবে।

এটিকে চালিত করার জন্য আপনি ঠিক এর মতো ডামি পূর্বাভাস করতে পারেন এবং তারপরে নন-কী কলামটি করতে পারেন:

[এ, বি] আপনার সূচক, [সি] - অন্য কলাম

সূচককে কাজে লাগাতে আপনি লিখুন:

SELECT
    A,B,C,D,E
FROM 
    test
WHERE
   A=1
AND
   B=B
AND 
   C=3

... কেন সিঙ্গেল এ সূচক পাওয়া গেলে ডিফল্টরূপে এটি যৌগিক সূচকটি নির্বাচন করে?

এটি কেবলমাত্র ক্ষেত্রে ক্ষেত্রে সূচক ব্যবহার করবে যদি এক বা দুটি পূর্বাভাস থাকে [এ] বা [এ], [বি]। এটি [বি], [এ] বা [এ], [সি] ক্রমে এটি ব্যবহার করবে না। অতিরিক্ত কলাম [সি] দিয়ে সূচকটি ব্যবহার করতে সক্ষম হতে আপনাকে [এ], [বি] এবং [সি] হিসাবে পূর্বাভাসের অর্ডার দিয়ে সূচি প্রয়োগ করতে হবে।


2
আপনি ঠিক কি দিয়ে অর্জন B=B? আমি মনে করি আপনি কিছুই অর্জন করতে পারেন না তাই আমি অনুপস্থিত কোনও প্রমাণই ভোট দিচ্ছি এটি কেবল অপ্টিমাইজার দ্বারা উপেক্ষা করা হয়নি
জ্যাক ডগলাস

2
B=Bকার্যকরভাবে হিসাবে একই B IS NOT NULL, যা জন্য অপ্রয়োজনীয় বলে মনে হচ্ছে। অবশ্যই কোনও সূচক ব্যবহার করার প্রয়োজন নেই (a,b)
এরউইন ব্র্যান্ডস্টেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.