প্রতিটি ধরণের ক্যোয়ারির জন্য কি আমার আলাদা সূচি দরকার, বা একটি মাল্টি-কলাম-ইনডেক্স কাজ করবে?


22

আমি ইতিমধ্যে এই প্রশ্নের উত্তরটি ইতিমধ্যে জানি, তবে আমি সবসময় মনে করি যদিও এই বিষয়টি নিয়ে আমার আরও কিছু করা দরকার।

আমার বোধগম্যতাটি হ'ল সাধারনত বলতে গেলে, একটি একক সূচক যা আপনাকে যে কোনও সময়ে অনুসন্ধান করা / বাছাই করতে পারে এমন সমস্ত ক্ষেত্রকে অন্তর্ভুক্ত করে কার্যকর হতে পারে না, তবুও আমি এই ধরণের জিনিসটি দেখেছি। যেমনটি ছিল, কেউ ভেবেছিল, "আচ্ছা, আমরা যদি কেবলমাত্র এই সমস্ত জিনিস একটি সূচীতে রেখে দিই, তবে সত্যিকারের কিছু ক্যোয়ারী চালানোর জন্য কোনও কার্যনির্বাহী পরিকল্পনা না দেখে ডেটাবেসগুলি এটির প্রয়োজনীয় যা তা খুঁজে পেতে এটি ব্যবহার করতে পারে"।

যেমন একটি টেবিল কল্পনা করুন:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime

আমি name, customerIdএবং dateCreatedক্ষেত্রগুলি সহ একটি একক সূচি দেখতে পাচ্ছি ।

তবে আমার বোধগম্যতা হল যে এই জাতীয় সূচকটি কোনও প্রশ্নের মতো ব্যবহার করা হবে না, উদাহরণস্বরূপ:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

যেমন একটি কোয়েরি জন্য, এটি আমার মনে হচ্ছে যে ভালো ধারণা সহ একটি সূচক হবে customerIdএবং dateCreatedক্ষেত্র, সঙ্গে customerIdক্ষেত্র হচ্ছে 'প্রথম'। এটি এমন একটি সূচি তৈরি করবে যাতে ডেটা এমনভাবে সংঘবদ্ধ হয় যাতে এই ক্যোয়ারীটি যা প্রয়োজন তা দ্রুত সন্ধান করতে পারে - যাতে এটির প্রয়োজন হয়।

আমি আরেকটি জিনিস, সম্ভবত প্রথম হিসাবে প্রায়শই ঘন ঘন, প্রতিটি ক্ষেত্রের পৃথক সূচক; তাই, এক প্রতিটি name, customerIdএবং dateCreatedক্ষেত্র।

প্রথম উদাহরণের মতো নয়, এই ধরণের ব্যবস্থাটি আমার কাছে মাঝে মাঝে কমপক্ষে আংশিকভাবে কার্যকর বলে মনে হয়; ক্যোয়ারীর সম্পাদন পরিকল্পনায় দেখাতে পারে যে কমপক্ষে এটি customerIdরেকর্ডগুলি নির্বাচন করতে সূচকটি ব্যবহার করছে , তবে তারা dateCreatedক্ষেত্রের সাথে সূচিটি তাদের সাজানোর জন্য ব্যবহার করছে না ।


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

তবে আমি অনুমান করি যে আমি যা জিজ্ঞাসা করছি সূচকগুলির জন্য একটি সাধারণ 'সূচনা পয়েন্ট' হিসাবে, নির্দিষ্ট, প্রায়শই টানা জিজ্ঞাসাগুলির জন্য নির্দিষ্ট সূচী রাখার ধারণা এবং যেখানে বা শৃঙ্খলে বা নির্দেশের বিধি অনুসারে ক্ষেত্রগুলিতে অর্থবোধ করা যায়?

উত্তর:


27

আপনি ঠিক বলেছেন যে আপনার উদাহরণ ক্যোয়ারীটি সেই সূচকটি ব্যবহার করবে না।

ক্যোয়ারী পরিকল্পনাকারী একটি সূচক ব্যবহার করে বিবেচনা করবে যদি:

  • এটিতে থাকা সমস্ত ক্ষেত্রগুলি কোয়েরিতে উল্লেখ করা হয়েছে
  • কিছু শুরু থেকে শুরু ক্ষেত্র রেফারেন্স করা হয়

এটি ক্যোয়ারী দ্বারা ব্যবহৃত না হয়ে কোনও ক্ষেত্র দিয়ে শুরু হওয়া সূচকগুলি ব্যবহার করতে সক্ষম হবে না।

সুতরাং আপনার উদাহরণের জন্য:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

এটি সূচকগুলি যেমন বিবেচনা করবে:

[customerId]
[customerId], [dateCreated]
[customerId], [dateCreated], [name]

কিন্তু না:

[name], [customerId], [dateCreated]

যদি এটি উভয়ই খুঁজে পেয়েছিল [customerId]এবং [customerId], [dateCreated], [name]তার একে অপরের তুলনায় তার সিদ্ধান্তের সিদ্ধান্ত সূচক পরিসংখ্যানগুলির উপর নির্ভর করে যা ক্ষেত্রগুলিতে ডেটা ভারসাম্যের অনুমানের উপর নির্ভর করে। যদি [customerId], [dateCreated]সংজ্ঞায়িত করা হয় তবে অন্য দুটির চেয়ে বেশি পছন্দ করা উচিত যদি না আপনি বিপরীতে নির্দিষ্ট সূচক ইঙ্গিত দেন।

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

সারণী বা সূচক স্ক্যানের কারণে অন্যথায় ধীর হয়ে যাওয়া ঘন ঘন প্রশ্নের জন্য নির্দিষ্ট সূচীগুলি সাধারণত একটি ভাল ধারণা, যদিও আপনি অন্যটির জন্য একটি পারফরম্যান্স ইস্যু আদান প্রদান করতে পারেন তাই এটি অত্যধিক করবেন না। আপনি যদি [customerId], [dateCreated]একটি সূচক হিসাবে সংজ্ঞায়িত করেন, উদাহরণস্বরূপ, মনে রাখবেন যে ক্যোয়ারার পরিকল্পনাকারী [customerId]যদি উপস্থিত থাকে তবে একটি সূচক ব্যবহার করবে এমন প্রশ্নের জন্য এটি ব্যবহার করতে সক্ষম হবেন । ব্যবহার করার সময় শুধু [customerId]যৌগ সূচক এই পর্যন্ত শেষ এক পরিবর্তে RAM- র মধ্যে স্থান জন্য প্রতিদ্বন্দ্বী দুই ইনডেক্স না থাকার নির্বাপিত করা যেতে পারে ব্যবহার চেয়ে সামান্য বেশি দক্ষ হবে (যদিও আপনার সমগ্র স্বাভাবিক কাজের সেট তড়কা সহজে র্যাম মধ্যে এই অতিরিক্ত মেমরি প্রতিযোগিতা নাও হতে পারে যদি একটি ইস্যু).


+1; দুর্দান্ত তথ্য, বিশেষত অনুস্মারক (যা আমি ভুলে যেতে চাই!) যে পরিকল্পনাকারী এমন সময়ে যৌগিক সূচক ব্যবহার করতে পারে যখন কোনও প্রশ্নের জন্য এটি থেকে কেবল প্রথম ক্ষেত্র (গুলি) প্রয়োজন।
অ্যান্ড্রু বার্বার

6

আপনার মূল প্রশ্নের উত্তর দিতে, হ্যাঁ, সূচিগুলি কেবল সারণীতে নয়, কোয়েরিগুলির চারপাশে নকশা করা উচিত । সূচকে ক্ষেত্রগুলির ক্রমটি অত্যন্ত গুরুত্বপূর্ণ। একাধিক প্রশ্নের জন্য অনুকূল হতে একটি একক সূচকের নকশা করা আরও শক্ত এবং আপনার ট্রেড-অফ করতে হবে।

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

সূচী ডিজাইনের জন্য আমার কৌশলটি সূচীকরণের জন্য:

  • ক্ষেত্রগুলি যেখানে নির্বাচিত (ক্রমে ক্রমানুসারে) ব্যবহৃত হয়েছে
  • অর্ডার বাইতে ব্যবহৃত ক্ষেত্রগুলি
  • একটি আচ্ছাদন সূচক তৈরি করতে অন্যান্য ক্ষেত্রগুলি (প্রয়োজনে) অন্তর্ভুক্ত করুন

সুতরাং আপনার উদাহরণের জন্য:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

আমি সম্ভবত (গ্রাহকআইডি, তারিখের তৈরি) ইনক্লুড (আইডি, নাম) এ একটি সূচি ডিজাইন করব। এই আচ্ছাদন সূচকটির অর্থ কোয়েরিকে কখনই মূল টেবিলটি আঘাত করতে হবে না, বিস্তৃতভাবে কর্মক্ষমতা উন্নত করা উচিত।

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


"সূচিকাগুলির জন্য +1 কেবল সারণীতে নয়, কোয়েরিগুলির চারপাশে ডিজাইন করতে হবে" এবং বাকী উত্তর যেমন উদাহরণটি খুব সহজ।
অ্যান্ড্রু বারবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.