এসকিউএল-এ ইনডেক্স। এসকিউএল সার্ভার এসকিউএল অনন্য সূচকে সূচক

সূচক- এটি আপনার কাজের মধ্যে প্রথম জিনিসটি ভালভাবে বুঝতে হবে SQL সার্ভার, কিন্তু অদ্ভুতভাবে মৌলিক প্রশ্নগুলি প্রায়ই ফোরামে জিজ্ঞাসা করা হয় না এবং অনেক উত্তর পায় না।
রব শেলডনএই প্রশ্নগুলির উত্তর দেয় যা পেশাদার চেনাশোনাগুলিতে সূচকগুলি সম্পর্কে বিভ্রান্তির সৃষ্টি করে৷ SQL সার্ভার: তাদের মধ্যে কিছু জিজ্ঞাসা করতে আমরা কেবল বিব্রতবোধ করি, কিন্তু অন্যদের জিজ্ঞাসা করার আগে আমরা প্রথমে দুবার চিন্তা করব।

ব্যবহৃত পরিভাষা:

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

এসকিউএল সার্ভারে সূচীর মৌলিক বিষয়।

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

টেবিল এবং ভিউ কলামে সূচী তৈরি করা হয়। সূচীগুলি সেই কলামগুলির মানগুলির উপর ভিত্তি করে দ্রুত ডেটা অনুসন্ধান করার একটি উপায় প্রদান করে৷ উদাহরণস্বরূপ, যদি আপনি একটি প্রাথমিক কীতে একটি সূচক তৈরি করেন এবং তারপরে প্রাথমিক কী মান ব্যবহার করে ডেটার সারি অনুসন্ধান করেন, তাহলে SQL সার্ভারপ্রথমে সূচকের মান খুঁজে বের করবে এবং তারপরে দ্রুত ডেটার সম্পূর্ণ সারি খুঁজে পেতে সূচকটি ব্যবহার করবে। একটি সূচী ছাড়া, টেবিলের সমস্ত সারিতে একটি সম্পূর্ণ স্ক্যান করা হবে, যা একটি উল্লেখযোগ্য কর্মক্ষমতা প্রভাব ফেলতে পারে।
আপনি একটি টেবিল বা ভিউতে বেশিরভাগ কলামে একটি সূচক তৈরি করতে পারেন। ব্যতিক্রমটি প্রধানত বড় বস্তু সংরক্ষণের জন্য ডেটা প্রকার সহ কলাম ( LOB), যেমন ইমেজ, পাঠ্যবা varchar(সর্বোচ্চ). আপনি বিন্যাসে ডেটা সঞ্চয় করার জন্য ডিজাইন করা কলামগুলিতে সূচীও তৈরি করতে পারেন এক্সএমএল, কিন্তু এই সূচীগুলি স্ট্যান্ডার্ডগুলির থেকে কিছুটা আলাদাভাবে গঠন করা হয়েছে এবং তাদের বিবেচনা এই নিবন্ধের সুযোগের বাইরে। এছাড়াও, নিবন্ধটি আলোচনা করে না কলামের দোকানসূচক পরিবর্তে, আমি সেই সূচীগুলিতে ফোকাস করি যা সাধারণত ডেটাবেসে ব্যবহৃত হয় SQL সার্ভার.
একটি সূচীতে পৃষ্ঠাগুলির একটি সেট, সূচক নোড থাকে যা একটি গাছের কাঠামোতে সংগঠিত হয় - সুষম গাছ. এই কাঠামোটি ক্রমানুসারী প্রকৃতির এবং ক্রমানুসারের শীর্ষে একটি রুট নোড দিয়ে শুরু হয় এবং পাতার নোডগুলি, পাতাগুলি নীচে, চিত্রে দেখানো হয়েছে:

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

ক্লাস্টার সূচক

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

নন-ক্লাস্টারড সূচক

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

সূচকের ধরন

একটি ক্লাস্টারড বা নন-ক্লাস্টারড সূচক হওয়ার পাশাপাশি, এটিকে আরও একটি যৌগিক সূচক, একটি অনন্য সূচক বা একটি কভারিং সূচক হিসাবে কনফিগার করা যেতে পারে।

যৌগিক সূচক

এই জাতীয় সূচকে একাধিক কলাম থাকতে পারে। আপনি একটি সূচকে 16টি পর্যন্ত কলাম অন্তর্ভুক্ত করতে পারেন, তবে তাদের মোট দৈর্ঘ্য 900 বাইটে সীমাবদ্ধ। ক্লাস্টারড এবং ননক্লাস্টারড সূচক উভয়ই কম্পোজিট হতে পারে।

অনন্য সূচক

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

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

এই ধরনের একটি সূচক একটি নির্দিষ্ট ক্যোয়ারীকে টেবিলের রেকর্ডগুলিতে অতিরিক্ত অ্যাক্সেস ছাড়াই অবিলম্বে সূচকের পাতাগুলি থেকে সমস্ত প্রয়োজনীয় ডেটা প্রাপ্ত করার অনুমতি দেয়।

ডিজাইনিং ইনডেক্স

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

তথ্যশালা

পূর্বে উল্লিখিত হিসাবে, সূচকগুলি সিস্টেমের কর্মক্ষমতা উন্নত করতে পারে কারণ... তারা ক্যোয়ারী ইঞ্জিনকে ডেটা খোঁজার দ্রুত উপায় প্রদান করে। যাইহোক, আপনি কত ঘন ঘন ডেটা সন্নিবেশ, আপডেট বা মুছে ফেলতে চান তাও আপনার বিবেচনায় নেওয়া উচিত। আপনি যখন ডেটা পরিবর্তন করেন, তখন ডেটাতে সংশ্লিষ্ট ক্রিয়াগুলি প্রতিফলিত করতে সূচীগুলিও পরিবর্তন করতে হবে, যা সিস্টেমের কার্যকারিতা উল্লেখযোগ্যভাবে হ্রাস করতে পারে। আপনার ইন্ডেক্সিং কৌশল পরিকল্পনা করার সময় নিম্নলিখিত নির্দেশিকাগুলি বিবেচনা করুন:

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

সূচী ডিজাইন করার সময় আরেকটি বিবেচনা হল ডাটাবেসের বিরুদ্ধে কোন প্রশ্নগুলি চালানো হচ্ছে। আগে যেমন বলা হয়েছে, আপনাকে অবশ্যই বিবেচনা করতে হবে যে কত ঘন ঘন ডেটা পরিবর্তন হয়। অতিরিক্তভাবে, নিম্নলিখিত নীতিগুলি ব্যবহার করা উচিত:

  • একাধিক একক প্রশ্নে এটি করার পরিবর্তে একটি ক্যোয়ারীতে যতটা সম্ভব সারি সন্নিবেশ বা সংশোধন করার চেষ্টা করুন।
  • কলামগুলিতে একটি নন-ক্লাস্টারড ইনডেক্স তৈরি করুন যা প্রায়শই আপনার অনুসন্ধানের শব্দ হিসাবে ব্যবহৃত হয়। কোথায়এবং সংযোগ যোগ দিন.
  • সঠিক মানের মিলের জন্য সারি লুকআপ ক্যোয়ারীতে ব্যবহৃত ইন্ডেক্সিং কলামগুলি বিবেচনা করুন।

কেন একটি টেবিল দুটি ক্লাস্টার সূচক থাকতে পারে না?

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

dbo.Sales(OrderID, LineID);

আপনি যখন এই স্ক্রিপ্টটি চালাবেন, তখন টেবিলের সমস্ত সারিগুলি প্রথমে OrderID কলাম এবং তারপর LineID দ্বারা শারীরিকভাবে সাজানো হবে, তবে ডেটা নিজেই একটি একক লজিক্যাল ব্লক, টেবিলে থাকবে। এই কারণে, আপনি দুটি ক্লাস্টার সূচক তৈরি করতে পারবেন না। একটি ডেটা সহ শুধুমাত্র একটি টেবিল থাকতে পারে এবং সেই টেবিলটি শুধুমাত্র একটি নির্দিষ্ট ক্রমে একবার সাজানো যেতে পারে।

যদি একটি ক্লাস্টার টেবিল অনেক সুবিধা প্রদান করে, তাহলে কেন একটি গাদা ব্যবহার করবেন?

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

আমি কিভাবে ডিফল্ট সূচক পূরণ ফ্যাক্টর পরিবর্তন করব?

ডিফল্ট ইনডেক্স ফিল ফ্যাক্টর পরিবর্তন করা এক জিনিস। ডিফল্ট অনুপাত কিভাবে কাজ করে তা বোঝা অন্য বিষয়। কিন্তু প্রথমে, কয়েক ধাপ পিছিয়ে যান। ইনডেক্স ফিল ফ্যাক্টর একটি নতুন পৃষ্ঠা পূরণ শুরু করার আগে নীচের স্তরে (পাতার স্তরে) সূচকটি সংরক্ষণ করার জন্য একটি পৃষ্ঠায় স্থানের পরিমাণ নির্ধারণ করে। উদাহরণস্বরূপ, যদি সহগটি 90 এ সেট করা হয়, তাহলে যখন সূচকটি বৃদ্ধি পাবে, তখন এটি পৃষ্ঠার 90% দখল করবে এবং তারপরে পরবর্তী পৃষ্ঠায় চলে যাবে।
ডিফল্টরূপে, ইনডেক্স ফিল ফ্যাক্টর মান আছে SQL সার্ভার 0, যা 100 এর সমান। ফলস্বরূপ, সমস্ত নতুন সূচী স্বয়ংক্রিয়ভাবে এই সেটিংটির উত্তরাধিকারী হয় যদি না আপনি নির্দিষ্টভাবে আপনার কোডে একটি মান নির্দিষ্ট করেন যা সিস্টেমের মান মান থেকে আলাদা বা ডিফল্ট আচরণ পরিবর্তন করে। তুমি ব্যবহার করতে পার এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওডিফল্ট মান সামঞ্জস্য করতে বা একটি সিস্টেম সঞ্চিত পদ্ধতি চালাতে sp_configure. উদাহরণস্বরূপ, নিম্নলিখিত সেট টি-এসকিউএলকমান্ড সহগ মান 90 এ সেট করে (আপনাকে প্রথমে উন্নত সেটিংস মোডে স্যুইচ করতে হবে):

EXEC sp_configure "উন্নত বিকল্পগুলি দেখান ", 1; পুনরায় কনফিগার করুন; যান EXEC sp_configure "ফিল ফ্যাক্টর", 90; পুনরায় কনফিগার করুন; যান

ইনডেক্স ফিল ফ্যাক্টর মান পরিবর্তন করার পরে, আপনাকে পরিষেবাটি পুনরায় চালু করতে হবে SQL সার্ভার. আপনি এখন নির্দিষ্ট দ্বিতীয় আর্গুমেন্ট ছাড়া sp_configure চালিয়ে সেট মান পরীক্ষা করতে পারেন:

EXEC sp_configure "ফিল ফ্যাক্টর" GO

এই কমান্ডটি 90 এর একটি মান প্রদান করবে। ফলস্বরূপ, সমস্ত নতুন তৈরি ইনডেক্স এই মান ব্যবহার করবে। আপনি একটি সূচক তৈরি করে এবং ফিল ফ্যাক্টর মানের জন্য অনুসন্ধান করে এটি পরীক্ষা করতে পারেন:

অ্যাডভেঞ্চার ওয়ার্কস 2012 ব্যবহার করুন; -- আপনার ডাটাবেসব্যক্তি.ব্যক্তি(শেষনাম); sys .indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং নাম "ix_people_lastname" ;

এই উদাহরণে, আমরা একটি টেবিলে একটি নন-ক্লাস্টারড সূচক তৈরি করেছি ব্যক্তিডাটাবেসে অ্যাডভেঞ্চার ওয়ার্কস 2012. ইনডেক্স তৈরি করার পর, আমরা sys.indexes সিস্টেম টেবিল থেকে ফিল ফ্যাক্টর মান পেতে পারি। ক্যোয়ারী 90 রিটার্ন করা উচিত.
যাইহোক, আসুন কল্পনা করি যে আমরা সূচকটি মুছে ফেলেছি এবং এটি আবার তৈরি করেছি, কিন্তু এখন আমরা একটি নির্দিষ্ট ফিল ফ্যাক্টর মান উল্লেখ করেছি:

ব্যক্তির উপর ix_people_lastname Nonclustered সূচক তৈরি করুন।Person(Last Name) এর সাথে (fillfactor=80); sys .indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং নাম "ix_people_lastname" ;

এবার আমরা নির্দেশনা যোগ করেছি সঙ্গেএবং বিকল্প গুণক পরিপূর্ণ করাআমাদের সূচক তৈরির অপারেশনের জন্য সূচক তৈরি করুনএবং মান 80 উল্লেখ করেছেন। অপারেটর নির্বাচন করুনএখন সংশ্লিষ্ট মান প্রদান করে।
এখন পর্যন্ত, সবকিছু বেশ সহজবোধ্য হয়েছে। যেখানে আপনি সত্যিই এই পুরো প্রক্রিয়ায় পুড়ে যেতে পারেন যখন আপনি একটি সূচক তৈরি করেন যা একটি ডিফল্ট সহগ মান ব্যবহার করে, ধরে নিই যে আপনি সেই মানটি জানেন। উদাহরণ স্বরূপ, কেউ সার্ভার সেটিংসের সাথে টিঙ্কার করছে এবং এতটাই একগুঁয়ে যে তারা সূচী পূরণের ফ্যাক্টরকে 20 এ সেট করেছে। এদিকে, আপনি ডিফল্ট মান 0 ধরে নিয়ে সূচী তৈরি করতে থাকবেন। দুর্ভাগ্যবশত, আপনার কাছে পূরণ করার কোন উপায় নেই। যতক্ষণ না আপনি একটি সূচক তৈরি করবেন না ততক্ষণ পর্যন্ত ফ্যাক্টর করুন এবং তারপরে মানটি পরীক্ষা করুন যেমন আমরা আমাদের উদাহরণগুলিতে করেছি। অন্যথায়, আপনাকে সেই মুহূর্তটির জন্য অপেক্ষা করতে হবে যখন ক্যোয়ারী কার্যক্ষমতা এতটা কমে যায় যে আপনি কিছু সন্দেহ করতে শুরু করেন।
আরেকটি সমস্যা যা আপনার সচেতন হওয়া উচিত তা হল সূচী পুনর্নির্মাণ। একটি সূচক তৈরি করার মতো, আপনি যখন এটি পুনর্নির্মাণ করবেন তখন আপনি সূচক পূরণ ফ্যাক্টর মান নির্দিষ্ট করতে পারেন। যাইহোক, create index কমান্ডের বিপরীতে, rebuild সার্ভারের ডিফল্ট সেটিংস ব্যবহার করে না, যদিও এটি মনে হতে পারে। এমনকি আরো, যদি আপনি নির্দিষ্টভাবে সূচক পূরণ ফ্যাক্টর মান উল্লেখ না করেন, তাহলে SQL সার্ভারসহগটির মান ব্যবহার করবে যার সাথে এই সূচকটি এর পুনর্গঠনের আগে বিদ্যমান ছিল। উদাহরণস্বরূপ, নিম্নলিখিত অপারেশন সূচক পরিবর্তন করুনআমরা এইমাত্র তৈরি করা সূচকটি পুনর্নির্মাণ করে:

সূচক পরিবর্তন করুন ix_people_stname on Person.Person REBUILD ; sys .indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং নাম "ix_people_lastname" ;

যখন আমরা ফিল ফ্যাক্টর মান পরীক্ষা করি, তখন আমরা 80 এর মান পাব, কারণ আমরা শেষবার সূচী তৈরি করার সময় এটি নির্দিষ্ট করেছিলাম। ডিফল্ট মান উপেক্ষা করা হয়.
আপনি দেখতে পাচ্ছেন, ইনডেক্স ফিল ফ্যাক্টর মান পরিবর্তন করা এতটা কঠিন নয়। বর্তমান মান জানা এবং কখন এটি প্রয়োগ করা হয় তা বোঝা অনেক বেশি কঠিন। সূচী তৈরি এবং পুনর্নির্মাণের সময় আপনি যদি সর্বদা বিশেষভাবে সহগ উল্লেখ করেন, তাহলে আপনি সর্বদা নির্দিষ্ট ফলাফল জানেন। অন্য কেউ সার্ভার সেটিংসকে আবার স্ক্রু না করে তা নিশ্চিত করার জন্য আপনাকে চিন্তা করতে হবে না, যার ফলে সমস্ত সূচকগুলি একটি হাস্যকরভাবে কম সূচক পূরণের ফ্যাক্টর দিয়ে পুনর্নির্মাণ করা হয়।

ডুপ্লিকেট রয়েছে এমন একটি কলামে একটি ক্লাস্টারড সূচক তৈরি করা কি সম্ভব?

হ্যা এবং না. হ্যাঁ আপনি একটি কী কলামে একটি ক্লাস্টারযুক্ত সূচক তৈরি করতে পারেন যাতে ডুপ্লিকেট মান রয়েছে। না, একটি কী কলামের মান একটি অ-অনন্য অবস্থায় থাকতে পারে না। আমাকে বিস্তারিত বলতে দাও. আপনি যদি একটি কলামে একটি নন-ইউনিক ক্লাস্টারড ইনডেক্স তৈরি করেন, তাহলে স্টোরেজ ইঞ্জিন অনন্যতা নিশ্চিত করতে ডুপ্লিকেট মানটিতে একটি ইউনিকিফায়ারের যোগ করে এবং তাই ক্লাস্টার করা টেবিলের প্রতিটি সারি সনাক্ত করতে সক্ষম হয়।
উদাহরণস্বরূপ, আপনি গ্রাহকের ডেটা ধারণকারী একটি কলামে একটি ক্লাস্টার সূচক তৈরি করার সিদ্ধান্ত নিতে পারেন নামের শেষাংশউপাধি রাখা। কলামটিতে ফ্র্যাঙ্কলিন, হ্যানকক, ওয়াশিংটন এবং স্মিথের মান রয়েছে। তারপরে আপনি আবার অ্যাডামস, হ্যানকক, স্মিথ এবং স্মিথের মান সন্নিবেশ করুন। কিন্তু কী কলামের মান অবশ্যই অনন্য হতে হবে, তাই স্টোরেজ ইঞ্জিনটি সদৃশগুলির মান পরিবর্তন করবে যাতে তারা দেখতে এইরকম কিছু দেখায়: অ্যাডামস, ফ্র্যাঙ্কলিন, হ্যানকক, হ্যানকক1234, ওয়াশিংটন, স্মিথ, স্মিথ4567 এবং স্মিথ5678৷
প্রথম নজরে, এই পদ্ধতিটি সূক্ষ্ম মনে হয়, তবে একটি পূর্ণসংখ্যার মান কীটির আকার বাড়ায়, যা একটি বড় সংখ্যক সদৃশ থাকলে সমস্যা হতে পারে এবং এই মানগুলি একটি নন-ক্লাস্টারড সূচক বা বিদেশী সূচকের ভিত্তি হয়ে উঠবে। মূল রেফারেন্স। এই কারণে, আপনি যখনই সম্ভব অনন্য ক্লাস্টার ইনডেক্স তৈরি করার চেষ্টা করুন। যদি এটি সম্ভব না হয়, তাহলে অন্তত একটি খুব উচ্চ অনন্য মান কন্টেন্ট সঙ্গে কলাম ব্যবহার করার চেষ্টা করুন.

একটি ক্লাস্টার সূচক তৈরি না হলে টেবিলটি কীভাবে সংরক্ষণ করা হয়?

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

মান স্বতন্ত্রতা সীমাবদ্ধতা এবং টেবিল সূচী সঙ্গে একটি প্রাথমিক কী মধ্যে সম্পর্ক কি?

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

কেন SQL সার্ভারে ক্লাস্টারড এবং নন-ক্লাস্টারড ইনডেক্সকে বি-ট্রি বলা হয়?

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

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

যদি আপনাকে এই সমস্ত সূচক নোডগুলি অতিক্রম করতে হয় তবে কীভাবে একটি সূচক এমনকি ক্যোয়ারী কর্মক্ষমতা উন্নত করতে পারে?

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

যদি সূচীগুলি এত দুর্দান্ত হয় তবে কেন প্রতিটি কলামে একটি তৈরি করবেন না?

কোনো ভালো কাজ যেন শাস্তি না হয়। অন্তত যে সূচকের ক্ষেত্রে. অবশ্যই, যতক্ষণ আপনি অপারেটর নিয়ে আসা প্রশ্নগুলি চালান ততক্ষণ সূচীগুলি দুর্দান্ত কাজ করে নির্বাচন করুন, কিন্তু যত তাড়াতাড়ি অপারেটরদের ঘন ঘন কল শুরু হয় ঢোকান, হালনাগাদএবং মুছে ফেলাতাই ল্যান্ডস্কেপ খুব দ্রুত পরিবর্তিত হয়।
আপনি যখন অপারেটর দ্বারা একটি ডেটা অনুরোধ শুরু করেন নির্বাচন করুন, ক্যোয়ারী ইঞ্জিন সূচী খুঁজে পায়, তার গাছের কাঠামোর মধ্য দিয়ে চলে, এবং এটি যে ডেটা খুঁজছে তা আবিষ্কার করে। কি সহজ হতে পারে? কিন্তু কিছু পরিবর্তন যদি আপনি একটি পরিবর্তন বিবৃতি মত শুরু হালনাগাদ. হ্যাঁ, বিবৃতির প্রথম অংশের জন্য, ক্যোয়ারী ইঞ্জিন আবার সূচী ব্যবহার করতে পারে সারিটি সংশোধন করা হচ্ছে - এটা ভালো খবর। এবং যদি একটি সারিতে ডেটাতে একটি সাধারণ পরিবর্তন হয় যা কী কলামগুলির পরিবর্তনগুলিকে প্রভাবিত করে না, তবে পরিবর্তন প্রক্রিয়াটি সম্পূর্ণ বেদনাদায়ক হবে। কিন্তু যদি পরিবর্তনের ফলে ডেটা সম্বলিত পৃষ্ঠাগুলিকে বিভক্ত করা হয়, অথবা একটি কী কলামের মান পরিবর্তন করা হয় যার ফলে এটি অন্য সূচক নোডে স্থানান্তরিত হয় - এর ফলে সূচীটিকে সম্ভবত সমস্ত সংশ্লিষ্ট সূচক এবং ক্রিয়াকলাপগুলিকে প্রভাবিত করে একটি পুনর্গঠনের প্রয়োজন হবে। , ফলস্বরূপ উৎপাদনশীলতা ব্যাপকভাবে হ্রাস পায়।
অপারেটরকে কল করার সময় অনুরূপ প্রক্রিয়াগুলি ঘটে মুছে ফেলা. একটি সূচক মুছে ফেলা ডেটা সনাক্ত করতে সাহায্য করতে পারে, কিন্তু ডেটা মুছে ফেলার ফলে পৃষ্ঠার পরিবর্তন হতে পারে। অপারেটর সম্পর্কে ঢোকান, সমস্ত সূচকের প্রধান শত্রু: আপনি প্রচুর পরিমাণে ডেটা যোগ করতে শুরু করেন, যা সূচীগুলির পরিবর্তন এবং তাদের পুনর্গঠনের দিকে নিয়ে যায় এবং প্রত্যেকে ক্ষতিগ্রস্ত হয়।
তাই আপনার ডাটাবেসের প্রশ্নের ধরন বিবেচনা করুন যখন কি ধরনের সূচক এবং কতগুলি তৈরি করতে হবে তা নিয়ে চিন্তা করুন। বেশি মানে ভালো নয়। একটি টেবিলে একটি নতুন সূচী যোগ করার আগে, শুধুমাত্র অন্তর্নিহিত প্রশ্নগুলির খরচই নয়, কিন্তু ডিস্কের স্থানের পরিমাণ, কার্যকারিতা এবং সূচকগুলি বজায় রাখার খরচও বিবেচনা করুন, যা অন্যান্য ক্রিয়াকলাপের উপর একটি ডমিনো প্রভাবের দিকে নিয়ে যেতে পারে। আপনার সূচক ডিজাইনের কৌশলটি আপনার বাস্তবায়নের সবচেয়ে গুরুত্বপূর্ণ দিকগুলির মধ্যে একটি এবং এতে সূচকের আকার, অনন্য মানগুলির সংখ্যা থেকে শুরু করে সূচকটি সমর্থন করবে এমন প্রশ্নের ধরন পর্যন্ত অনেক বিবেচনা অন্তর্ভুক্ত করা উচিত।

একটি প্রাথমিক কী সহ একটি কলামে একটি ক্লাস্টারযুক্ত সূচক তৈরি করা কি প্রয়োজনীয়?

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

যদি আপনি একটি ভিউ সূচী করেন তবে এটি কি এখনও একটি দৃশ্য?

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

কেন একটি যৌগিক সূচক পরিবর্তে একটি আবরণ সূচক ব্যবহার?

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

OrderID নির্বাচন করুন, বিক্রয় থেকে অর্ডার তারিখ যেখানে OrderID = 12345 ;

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

dbo.Sales(OrderID) এর অন্তর্ভুক্ত (OrderDate);

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

একটি কী কলামে সদৃশ সংখ্যা কি গুরুত্বপূর্ণ?

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

একটি কী কলামের ডেটার শুধুমাত্র একটি নির্দিষ্ট উপসেটে একটি নন-ক্লাস্টারড সূচক তৈরি করা কি সম্ভব?

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

বিক্রয়ের উপর অনির্ভর সূচক ix_trackingnumber তৈরি করুন। SalesOrderDetail(CarrierTrackingNumber) যেখানে CarrierTrackingNumber শূন্য নয়;

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

6. সূচক এবং কর্মক্ষমতা অপ্টিমাইজেশান

ডাটাবেসে সূচি: উদ্দেশ্য, কর্মক্ষমতার উপর প্রভাব, সূচক তৈরির নীতি

6.1 সূচকগুলি কিসের জন্য?

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

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

সূচক তৈরির সাথে যুক্ত কিছু সাধারণ নীতি:

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

· স্বতন্ত্রতা সীমাবদ্ধতা সাপেক্ষে কলামগুলির জন্য একটি সূচক স্বয়ংক্রিয়ভাবে তৈরি করা আবশ্যক;

· যেসব ক্ষেত্রে ন্যূনতম সংখ্যক পুনরাবৃত্তির মান রয়েছে এবং ডেটা সমানভাবে বিতরণ করা হয়েছে সেগুলির জন্য সূচী তৈরি করা ভাল। ওরাকলের প্রচুর সংখ্যক ডুপ্লিকেট মান সহ কলামগুলির জন্য বিশেষ বিট সূচী রয়েছে এবং এসকিউএল সার্ভার এই ধরণের সূচক প্রদান করে না;

· যদি সার্চ ক্রমাগত একটি নির্দিষ্ট কলামের সেটে সঞ্চালিত হয় (একসাথে), তাহলে এই ক্ষেত্রে এটি একটি যৌগিক সূচক তৈরি করার অর্থ হতে পারে (শুধুমাত্র SQL সার্ভারে) - কলামগুলির একটি গ্রুপের জন্য একটি সূচক;

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

· সূচীগুলি শুধুমাত্র টেবিলের জন্য নয়, ভিউগুলির জন্যও তৈরি করা যেতে পারে (শুধুমাত্র SQL সার্ভারে)। সুবিধাগুলি - অনুরোধের সময় নয় ক্ষেত্রগুলি গণনা করার ক্ষমতা, তবে এই মুহূর্তে টেবিলে নতুন মানগুলি উপস্থিত হয়।

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

সাধারণ জ্ঞাতব্য

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

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

কিন্তু একটি বই সূচক এবং একটি ডাটাবেস সূচকের মধ্যে দুটি উল্লেখযোগ্য পার্থক্য রয়েছে:

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

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

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

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

সূচীগুলির এই বৈশিষ্ট্যটি অত্যন্ত গুরুত্বপূর্ণ কারণ সূচী পৃষ্ঠাগুলি অতিক্রম করার জন্য প্রয়োজনীয় I/O অপারেশনগুলির সংখ্যা সংশ্লিষ্ট ডেটা পৃষ্ঠাগুলি অতিক্রম করার জন্য প্রয়োজনীয় I/O অপারেশনগুলির সংখ্যার তুলনায় উল্লেখযোগ্যভাবে কম৷ অন্য কথায়, একটি টেবিল স্ক্যান করার জন্য সম্ভবত টেবিলের সূচী স্ক্যান করার চেয়ে অনেক বেশি I/O অপারেশন প্রয়োজন।

ডাটাবেস ইঞ্জিন ইনডেক্স একটি B+ ট্রি ডেটা স্ট্রাকচার ব্যবহার করে তৈরি করা হয়। একটি B+ গাছের একটি গাছের কাঠামো রয়েছে যেখানে সমস্ত নীচের নোডগুলি গাছের উপরের (রুট নোড) থেকে একই সংখ্যক স্তর দূরে থাকে। সূচীকৃত কলাম থেকে ডেটা যোগ বা সরানো হলেও এই বৈশিষ্ট্যটি বজায় রাখা হয়।

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

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

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

নিম্নলিখিত বিভাগগুলিতে, আমরা দুটি বিদ্যমান ধরণের সূচী দেখব, ক্লাস্টারড এবং ননক্লাস্টারড, এবং কীভাবে সূচী তৈরি করতে হয় তা শিখব।

ক্লাস্টার ইনডেক্স

ক্লাস্টার সূচকএকটি টেবিলে ডেটার ভৌত ক্রম নির্ধারণ করে। ডাটাবেস ইঞ্জিন আপনাকে একটি টেবিলের জন্য শুধুমাত্র একটি ক্লাস্টার সূচক তৈরি করতে দেয়, কারণ একটি টেবিলের সারি শারীরিকভাবে একাধিক উপায়ে অর্ডার করা যাবে না। একটি ক্লাস্টারড ইনডেক্স ব্যবহার করে একটি অনুসন্ধান একটি B+ গাছের রুট নোড থেকে গাছের নোডগুলির দিকে সঞ্চালিত হয় যা একটি দ্বিগুণ লিঙ্কযুক্ত তালিকায় একসাথে সংযুক্ত থাকে পৃষ্ঠা চেইন.

একটি গুচ্ছ সূচকের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল যে এর ট্রি নোডগুলিতে ডেটার পৃষ্ঠা থাকে। (গুচ্ছ সূচী নোডের অন্যান্য সমস্ত স্তরে সূচী পৃষ্ঠা থাকে।) যে টেবিলে একটি ক্লাস্টার সূচক সংজ্ঞায়িত (হয় স্পষ্টভাবে বা অন্তর্নিহিতভাবে) থাকে তাকে ক্লাস্টার টেবিল বলা হয়। একটি ক্লাস্টারযুক্ত সূচকের B+ গাছের গঠন নীচের চিত্রে দেখানো হয়েছে:

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

ক্লাস্টার করা সূচীগুলি খুব দ্রুত ডেটা অ্যাক্সেস প্রদান করে যখন একটি ক্যোয়ারী বিভিন্ন মান অনুসন্ধান করে।

নন-ক্লাস্টারড ইনডেক্স

একটি নন-ক্লাস্টারড সূচকের গঠনটি ক্লাস্টারযুক্ত সূচকের মতোই, তবে দুটি গুরুত্বপূর্ণ পার্থক্য সহ:

    একটি নন-ক্লাস্টারড সূচক টেবিলের সারিগুলির শারীরিক ক্রম পরিবর্তন করে না;

    নন-ক্লাস্টারড ইনডেক্স নোড পৃষ্ঠাগুলি ইনডেক্স কী এবং বুকমার্ক নিয়ে গঠিত।

যদি আপনি একটি টেবিলে এক বা একাধিক নন-ক্লাস্টারড ইনডেক্স সংজ্ঞায়িত করেন, তাহলে টেবিলের সারির প্রকৃত ক্রম পরিবর্তন করা হবে না। প্রতিটি নন-ক্লাস্টারড সূচকের জন্য, ডেটাবেস ইঞ্জিন একটি অতিরিক্ত সূচক কাঠামো তৈরি করে যা সূচী পৃষ্ঠাগুলিতে সংরক্ষণ করা হয়। একটি নন-ক্লাস্টারড সূচকের B+ গাছের গঠন নীচের চিত্রে দেখানো হয়েছে:

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

পূর্বে উল্লিখিত হিসাবে, একটি নন-ক্লাস্টারড সূচক ব্যবহার করে ডেটা অনুসন্ধান করা টেবিলের ধরণের উপর নির্ভর করে দুটি ভিন্ন উপায়ে করা যেতে পারে:

    heap - একটি নন-ক্লাস্টারড ইনডেক্সের সার্চ স্ট্রাকচার অতিক্রম করুন, যার পরে সারি আইডেন্টিফায়ার ব্যবহার করে সারিটি পুনরুদ্ধার করা হয়;

    ক্লাস্টার টেবিল - একটি নন-ক্লাস্টারড সূচক কাঠামোর একটি অনুসন্ধান ট্রাভার্সাল এবং অনুরূপ ক্লাস্টারযুক্ত সূচকের একটি ট্রাভার্সাল অনুসরণ করে।

উভয় ক্ষেত্রেই, I/O ক্রিয়াকলাপের পরিমাণ বেশ বড়, তাই আপনার সতর্কতার সাথে একটি নন-ক্লাস্টারড সূচক ডিজাইন করা উচিত, এবং আপনি যদি নিশ্চিত হন যে এটির ব্যবহার উল্লেখযোগ্যভাবে কর্মক্ষমতা উন্নত করবে তবেই এটি ব্যবহার করুন।

লেনদেন-এসকিউএল ভাষা এবং সূচী

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

সূচক তৈরি করা

বিবৃতি ব্যবহার করে একটি টেবিলের একটি সূচক তৈরি করা হয় সূচক তৈরি করুন. এই নির্দেশে নিম্নলিখিত সিনট্যাক্স আছে:

টেবিল_নাম (কলাম1 ,...) [ অন্তর্ভুক্ত করুন (কলাম_নাম [ ,... ]) ] [[, ] PAD_INDEX = (চালু | বন্ধ)] [[, ] ড্রপ_এক্সস্টিং = (চালু | বন্ধ)] [[ , ] SORT_IN_TEMPDB = (চালু | বন্ধ)] [[, ] IGNORE_DUP_KEY = (চালু | বন্ধ)] [[, ] ALLOW_ROW_LOCKS = (চালু | বন্ধ)] [[, ] ALLOW_PAGE_LOCKS = (চালু | বন্ধ)] [[ STATISTICS_NORECOMPUTE = (চালু | বন্ধ)] [[, ] অনলাইন = (চালু | বন্ধ)]] সিনট্যাক্স নিয়মাবলী

index_name প্যারামিটারটি তৈরি করা সূচকের নাম নির্দিষ্ট করে। টেবিল_নাম প্যারামিটার দ্বারা চিহ্নিত একটি একক টেবিলের এক বা একাধিক কলামে একটি সূচক তৈরি করা যেতে পারে। যে কলামটিতে সূচকটি তৈরি করা হয়েছে সেটি column1 প্যারামিটার দ্বারা নির্দিষ্ট করা হয়েছে। এই প্যারামিটারের সাংখ্যিক প্রত্যয়টি নির্দেশ করে যে টেবিলের একাধিক কলামে সূচক তৈরি করা যেতে পারে। ডাটাবেস ইঞ্জিন ভিউতে সূচী তৈরি করতেও সহায়তা করে।

আপনি যেকোনো টেবিল কলাম সূচী করতে পারেন। এর মানে হল যে VARBINARY(max), BIGINT, এবং SQL_VARIANT ডেটা টাইপ মান ধারণকারী কলামগুলিও ইন্ডেক্স করা যেতে পারে।

সূচক সহজ বা যৌগিক হতে পারে। একটি একক কলামে একটি সাধারণ সূচক তৈরি করা হয়, যখন একাধিক কলামে একটি যৌগিক সূচক তৈরি করা হয়। একটি যৌগিক সূচক এর আকার এবং কলামের সংখ্যা সম্পর্কিত কিছু সীমাবদ্ধতা রয়েছে। একটি সূচক সর্বাধিক 900 বাইট এবং সর্বাধিক 16 টি কলাম থাকতে পারে।

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

CLUSTERED প্যারামিটারএকটি ক্লাস্টার সূচক নির্দিষ্ট করে, এবং NONCLUSTERED প্যারামিটার(ডিফল্ট) উল্লেখ করে যে সূচী টেবিলের সারিগুলির ক্রম পরিবর্তন করে না। ডাটাবেস ইঞ্জিন একটি টেবিলে সর্বাধিক 249টি নন-ক্লাস্টারড ইনডেক্সের অনুমতি দেয়।

ডাটাবেস ইঞ্জিনটি কলামের মানের অবরোহী ক্রম সহ সূচকগুলিকে সমর্থন করার জন্য উন্নত করা হয়েছে। কলামের নামের পরে ASC প্যারামিটারটি নির্দিষ্ট করে যে সূচকটি কলামের মানের ক্রমবর্ধমান ক্রম অনুসারে তৈরি করা হয়েছে এবং DESC প্যারামিটারটি সূচী কলামের মানগুলির অবরোহ ক্রম নির্দিষ্ট করে। এটি সূচক ব্যবহারে বৃহত্তর নমনীয়তা প্রদান করে। নিচের ক্রম অনুসারে, আপনার কলামগুলিতে যৌগিক সূচী তৈরি করা উচিত যার মানগুলি বিপরীত দিকে ক্রম করা হয়।

প্যারামিটার অন্তর্ভুক্ত করুনআপনাকে ননকি কলামগুলি নির্দিষ্ট করার অনুমতি দেয় যা একটি নন-ক্লাস্টারড সূচকের নোড পৃষ্ঠাগুলিতে যোগ করা হয়। অন্তর্ভুক্ত তালিকার কলামের নামগুলি অবশ্যই পুনরাবৃত্তি করা উচিত নয় এবং একটি কলাম কী এবং নন-কী কলাম হিসাবে ব্যবহার করা যাবে না৷

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

FILLFACTOR প্যারামিটারসূচক তৈরির সময় প্রতিটি সূচক পৃষ্ঠার শতকরা কত শতাংশ পূরণ করতে হবে তা নির্দিষ্ট করে। FILLFACTOR প্যারামিটারের মান 1 থেকে 100 পর্যন্ত পরিসরে সেট করা যেতে পারে। n=100 মান সহ, প্রতিটি সূচক পৃষ্ঠা 100% পূর্ণ হয়, অর্থাৎ একটি বিদ্যমান নোড পৃষ্ঠার পাশাপাশি একটি নন-নোড পৃষ্ঠায় নতুন সারি সন্নিবেশ করার জন্য ফাঁকা স্থান থাকবে না। অতএব, শুধুমাত্র স্ট্যাটিক টেবিলের জন্য এই মান ব্যবহার করার সুপারিশ করা হয়। (ডিফল্ট মান, n=0, এর অর্থ হল সূচক নোড পৃষ্ঠাগুলি পূর্ণ এবং মধ্যবর্তী পৃষ্ঠাগুলির প্রতিটিতে একটি এন্ট্রির জন্য ফাঁকা স্থান রয়েছে৷)

যদি FILLFACTOR প্যারামিটারটি 1 এবং 99 এর মধ্যে মানগুলিতে সেট করা হয়, তৈরি করা সূচক কাঠামোর নোড পৃষ্ঠাগুলিতে ফাঁকা স্থান থাকবে। n এর মান যত বড় হবে, ইনডেক্স নোড পৃষ্ঠাগুলিতে কম ফাঁকা জায়গা থাকবে। উদাহরণস্বরূপ, n=60 সহ, প্রতিটি সূচক নোড পৃষ্ঠায় ভবিষ্যতে সূচক সারি সন্নিবেশের জন্য 40% ফাঁকা স্থান থাকবে। (ইনডেক্স সারিগুলি একটি INSERT বা UPDATE স্টেটমেন্ট ব্যবহার করে ঢোকানো হয়৷) এইভাবে, n=60 এর একটি মান সেই টেবিলের জন্য যুক্তিসঙ্গত হবে যার ডেটা মোটামুটি ঘন ঘন পরিবর্তন হয়৷ 1 এবং 99-এর মধ্যে FILLFACTOR মানগুলির জন্য, মধ্যবর্তী সূচী পৃষ্ঠাগুলিতে প্রতিটি একটি এন্ট্রির জন্য ফাঁকা স্থান রয়েছে।

একবার একটি সূচক তৈরি হয়ে গেলে, FILLFACTOR মান ব্যবহারের সময় সমর্থিত নয়। অন্য কথায়, এটি শুধুমাত্র উপলব্ধ ডেটার সাথে সংরক্ষিত স্থানের পরিমাণ নির্দেশ করে যখন ফাঁকা স্থানের শতাংশ নির্ধারণ করা হয়। FILLFACTOR প্যারামিটারটিকে তার আসল মানতে পুনরুদ্ধার করতে, ALTER INDEX বিবৃতিটি ব্যবহার করুন।

PAD_INDEX প্যারামিটার FILLFACTOR প্যারামিটারের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। FILLFACTOR প্যারামিটার মূলত সূচক নোডের মোট পৃষ্ঠা আকারের শতাংশ হিসাবে খালি স্থানের পরিমাণ নির্দিষ্ট করে। এবং PAD_INDEX প্যারামিটার নির্দিষ্ট করে যে FILLFACTOR প্যারামিটারের মান ইনডেক্সের পৃষ্ঠা এবং ডেটা পৃষ্ঠা উভয় ক্ষেত্রেই প্রযোজ্য।

DROP_EXISTING প্যারামিটার৷একটি নন-ক্লাস্টার সূচক আছে এমন একটি টেবিলে ক্লাস্টারড সূচক পুনরুত্পাদন করার সময় আপনাকে কর্মক্ষমতা উন্নত করার অনুমতি দেয়। আরও তথ্যের জন্য, নীচের "সূচক পুনর্নির্মাণ" বিভাগটি দেখুন।

SORT_IN_TEMPDB প্যারামিটার৷ tempdb সিস্টেম ডাটাবেসে একটি সূচক তৈরি করার সময় ব্যবহৃত মধ্যবর্তী বাছাই অপারেশন থেকে ডেটা স্থাপন করতে ব্যবহৃত হয়। tempdb ডেটার চেয়ে ভিন্ন ডিস্কে অবস্থিত হলে এটি কর্মক্ষমতা উন্নত করতে পারে।

IGNORE_DUP_KEY প্যারামিটার৷সূচীকৃত কলামগুলিতে সদৃশ মান সন্নিবেশ করার প্রচেষ্টাকে উপেক্ষা করার জন্য সিস্টেমকে অনুমতি দেয়৷ একটি INSERT বিবৃতি একটি সূচীকৃত কলামে ডুপ্লিকেট ডেটা সন্নিবেশ করার সময় একটি দীর্ঘ-চলমান লেনদেন বাতিল করা এড়াতে শুধুমাত্র এই বিকল্পটি ব্যবহার করা উচিত। যখন এই বিকল্পটি সক্রিয় করা হয়, যখন একটি INSERT বিবৃতি সূচির স্বতন্ত্রতা লঙ্ঘন করে এমন একটি টেবিলে সারি সন্নিবেশ করার চেষ্টা করে, তখন ডাটাবেস সিস্টেম সম্পূর্ণ বিবৃতিটি ক্র্যাশ করার পরিবর্তে একটি সতর্কতা জারি করে। এই ক্ষেত্রে, ডাটাবেস ইঞ্জিন ডুপ্লিকেট কী মান সহ সারিগুলি সন্নিবেশিত করে না, তবে কেবল তাদের উপেক্ষা করে এবং সঠিক সারিগুলি যোগ করে। যদি এই পরামিতি সেট না করা হয়, তাহলে সম্পূর্ণ নির্দেশের বাস্তবায়ন অস্বাভাবিকভাবে বন্ধ হয়ে যাবে।

কখন প্যারামিটার ALLOW_ROW_LOCKSসক্রিয় (চালু করা হয়েছে), সিস্টেম সারি লকিং প্রয়োগ করে। একইভাবে, সক্রিয় করা হলে প্যারামিটার ALLOW_PAGE_LOCKS, সিস্টেম একযোগে অ্যাক্সেসের সময় পৃষ্ঠা লকিং প্রয়োগ করে। STATISTICS_NORECOMPUTE প্যারামিটারনির্দিষ্ট সূচকের জন্য পরিসংখ্যানের স্বয়ংক্রিয় পুনঃগণনার অবস্থা নির্ধারণ করে।

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

প্যারামিটার চালুডিফল্ট ফাইলগ্রুপ (ডিফল্ট মান) অথবা নির্দিষ্ট ফাইলগ্রুপ (ফাইল_গ্রুপ মান) হয় নির্দিষ্ট সূচক তৈরি করে।

নীচের উদাহরণটি দেখায় কিভাবে কর্মচারী টেবিলের আইডি কলামে একটি নন-ক্লাস্টারড সূচক তৈরি করতে হয়:

স্যাম্পলডিবি ব্যবহার করুন; কর্মচারীর (আইডি) উপর ইনডেক্স ix_empid তৈরি করুন;

একটি একক-মূল্যযুক্ত যৌগিক সূচক তৈরি করা নীচের উদাহরণে দেখানো হয়েছে:

স্যাম্পলডিবি ব্যবহার করুন; FILLFACTOR=80 সহ Works_on (EmpId, ProjectNumber) অন ইউনিক ইনডেক্স ix_empid_prnu তৈরি করুন;

এই উদাহরণে, প্রতিটি কলামের মান একক সংখ্যা হতে হবে। যখন একটি সূচক তৈরি করা হয়, প্রতিটি সূচক নোড পৃষ্ঠার 80% স্থান পূর্ণ হয়।

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

ইনডেক্স ফ্র্যাগমেন্টেশন সম্পর্কে তথ্য পাওয়া

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

অভ্যন্তরীণ সূচক ফ্র্যাগমেন্টেশন সম্পর্কে তথ্য পেতে, একটি DMV গতিশীল ব্যবস্থাপনা দৃশ্য বলা হয় sys.dm_db_index_physical_stats. এই DMV নির্দিষ্ট পৃষ্ঠার ডেটা এবং সূচীগুলির ভলিউম এবং খণ্ডিতকরণ সম্পর্কে তথ্য প্রদান করে। প্রতিটি পৃষ্ঠার জন্য, B+ গাছের প্রতিটি স্তরের জন্য একটি সারি ফেরত দেওয়া হয়। এই DMV ব্যবহার করে, আপনি ডেটা পৃষ্ঠাগুলিতে সারি ফ্র্যাগমেন্টেশনের ডিগ্রি সম্পর্কে তথ্য পেতে পারেন, যার উপর ভিত্তি করে আপনি সিদ্ধান্ত নিতে পারেন যে ডেটা পুনর্গঠন করা হবে কিনা।

sys.dm_db_index_physical_stats ভিউ ব্যবহার নিচের উদাহরণে দেখানো হয়েছে। (আপনি ব্যাচের উদাহরণটি চালানোর আগে, আপনাকে অবশ্যই ওয়ার্কস_অন টেবিলে বিদ্যমান সমস্ত সূচী ড্রপ করতে হবে। সূচী ড্রপ করতে, DROP INDEX বিবৃতিটি ব্যবহার করুন, যা পরে দেখানো হয়েছে।)

স্যাম্পলডিবি ব্যবহার করুন; ঘোষণা করুন @dbId INT; @tabId INT ঘোষণা করুন; @indId INT ঘোষণা করুন; SET @dbId = DB_ID("SampleDb"); SET @tabId = OBJECT_ID("কর্মচারী"); sys.dm_db_index_physical_stats (@dbId, @tabId, NULL, NULL, NULL) থেকে avg_fragmentation_in_percent, avg_page_space_used_in_percent নির্বাচন করুন;

আপনি উদাহরণ থেকে দেখতে পাচ্ছেন, sys.dm_db_index_physical_stats ভিউতে পাঁচটি প্যারামিটার রয়েছে। প্রথম তিনটি পরামিতি যথাক্রমে বর্তমান ডাটাবেস, টেবিল এবং সূচকের আইডি সংজ্ঞায়িত করে। চতুর্থ প্যারামিটারটি পার্টিশন আইডি নির্দিষ্ট করে, এবং শেষ প্যারামিটারটি পরিসংখ্যানগত তথ্য পেতে ব্যবহৃত স্ক্যানিং স্তরটি নির্দিষ্ট করে। (একটি নির্দিষ্ট প্যারামিটারের জন্য ডিফল্ট মান NULL মান ব্যবহার করে নির্দিষ্ট করা যেতে পারে।)

এই ভিউয়ের কলামগুলির মধ্যে সবচেয়ে গুরুত্বপূর্ণ হল avg_fragmentation_in_percent এবং avg_page_space_used_in_percent কলাম। প্রথমটি শতাংশ হিসাবে বিভক্তকরণের গড় স্তর নির্দেশ করে এবং দ্বিতীয়টি শতাংশ হিসাবে দখলকৃত স্থানের পরিমাণ নির্ধারণ করে।

সূচক তথ্য সম্পাদনা

পূর্ববর্তী বিভাগে আলোচনা করা সূচী বিভক্তকরণ তথ্যের সাথে আপনি পরিচিত হয়ে গেলে, আপনি নিম্নলিখিত সিস্টেম সরঞ্জামগুলি ব্যবহার করে এটি এবং অন্যান্য সূচক তথ্য সম্পাদনা করতে পারেন:

    ডিরেক্টরি ভিউ sys.indexes;

    ক্যাটালগ ভিউ sys.index_columns;

    সিস্টেম পদ্ধতি sp_helpindex;

    বস্তুসম্পত্তি সম্পত্তি ফাংশন;

    SQL সার্ভারের জন্য ব্যবস্থাপনা স্টুডিও ব্যবস্থাপনা পরিবেশ;

    DMV ডাইনামিক ম্যানেজমেন্ট ভিউ sys.dm_db_index_usage_stats;

    DMV ডাইনামিক ম্যানেজমেন্ট ভিউ sys.dm_db_missing_index_details।

ক্যাটালগ ভিউ sys.indexesপ্রতিটি সূচকের জন্য একটি সারি এবং একটি ক্লাস্টারড সূচক ছাড়া প্রতিটি টেবিলের জন্য একটি সারি রয়েছে৷ এই ক্যাটালগ ভিউয়ের সবচেয়ে গুরুত্বপূর্ণ কলাম হল object_id, name, এবং index_id কলাম। অবজেক্ট_আইডি কলামে সূচির মালিক ডাটাবেস অবজেক্টের নাম থাকে এবং নাম এবং index_id কলামে যথাক্রমে সেই সূচকের নাম এবং আইডি থাকে।

ক্যাটালগ ভিউ sys.index_columnsপ্রতিটি কলামের জন্য একটি সারি রয়েছে যা সূচক বা স্তূপের অংশ। এই তথ্যটি নির্দিষ্ট সূচকের বৈশিষ্ট্য সম্পর্কে অতিরিক্ত তথ্য পেতে sys.indexes ক্যাটালগ ভিউয়ের মাধ্যমে প্রাপ্ত তথ্যের সাথে একত্রে ব্যবহার করা যেতে পারে।

সিস্টেম পদ্ধতি sp_helpindexসারণি সূচী সংক্রান্ত তথ্যের পাশাপাশি কলামের পরিসংখ্যানগত তথ্য প্রদান করে। এই পদ্ধতিতে নিম্নলিখিত সিনট্যাক্স রয়েছে:

sp_helpindex [@db_object = ] "নাম"

এখানে @db_object ভেরিয়েবল টেবিলের নাম উপস্থাপন করে।

সূচকের সাথে সম্পর্কিত, অবজেক্ট প্রোপার্টি ফাংশনদুটি বৈশিষ্ট্য আছে: IsIndexed এবং IsIndexable. প্রথম বৈশিষ্ট্যটি টেবিল বা ভিউয়ের একটি সূচক আছে কিনা সে সম্পর্কে তথ্য প্রদান করে এবং দ্বিতীয় বৈশিষ্ট্যটি নির্দেশ করে যে টেবিল বা ভিউটি সূচীযোগ্য কিনা।

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

কর্মক্ষমতা sys.dm_db_index_usage_statsবিভিন্ন ধরনের সূচক অপারেশনের একটি গণনা প্রদান করে এবং শেষবার প্রতিটি ধরনের অপারেশন সম্পাদিত হয়েছিল। একটি একক কোয়েরিতে একটি নির্দিষ্ট সূচকে প্রতিটি পৃথক অনুসন্ধান, সন্ধান বা আপডেট অপারেশনকে সূচকের ব্যবহার হিসাবে বিবেচনা করা হয় এবং সেই DMV-তে সংশ্লিষ্ট কাউন্টারটিকে এক দ্বারা বৃদ্ধি করে। এইভাবে, আপনি একটি সূচক কত ঘন ঘন ব্যবহার করা হয় সে সম্পর্কে সাধারণ তথ্য পেতে পারেন, যাতে আপনি কোন সূচকগুলি বেশি ব্যবহার করা হচ্ছে এবং কোনটি কম ব্যবহার করা হচ্ছে তা নির্ধারণ করতে এটি ব্যবহার করতে পারেন।

কর্মক্ষমতা sys.dm_db_missing_index_detailsসারণি কলাম সম্পর্কে বিস্তারিত তথ্য প্রদান করে যার জন্য কোনো সূচী নেই। এই DMV-এর সবচেয়ে গুরুত্বপূর্ণ কলাম হল index_handle এবং object_id কলাম। প্রথম কলামের মানটি নির্দিষ্ট অনুপস্থিত সূচকটিকে চিহ্নিত করে এবং দ্বিতীয় কলামের মানটি সূচীটি অনুপস্থিত টেবিলটিকে চিহ্নিত করে৷

সূচী পরিবর্তন

ডেটাবেস ইঞ্জিন হল কয়েকটি ডাটাবেস সিস্টেমের মধ্যে একটি যা বিবৃতি সমর্থন করে সূচক পরিবর্তন করুন. এই বিবৃতি সূচক রক্ষণাবেক্ষণ অপারেশন সঞ্চালন করতে ব্যবহার করা যেতে পারে. ALTER INDEX স্টেটমেন্টের সিনট্যাক্স CREATE INDEX স্টেটমেন্টের সিনট্যাক্সের সাথে অনেকটাই মিল। অন্য কথায়, এই বিবৃতিটি আপনাকে ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, IGNORE_DUP_KEY, এবং STATISTICS_NORECOMPUTE প্যারামিটারের মান পরিবর্তন করতে দেয় যা পূর্বে CREATE INDEX বিবৃতিতে বর্ণিত হয়েছে।

উপরের বিকল্পগুলি ছাড়াও, ALTER INDEX বিবৃতিটি অন্য তিনটি বিকল্পকে সমর্থন করে:

    পরামিতি পুনর্নির্মাণ, সূচক পুনরায় তৈরি করতে ব্যবহৃত;

    পরামিতি পুনর্গঠন, ইনডেক্স নোড পৃষ্ঠাগুলি পুনর্গঠন করতে ব্যবহৃত হয়;

    অক্ষম প্যারামিটার, সূচক নিষ্ক্রিয় করতে ব্যবহৃত. এই তিনটি বিকল্প নিচের উপধারায় আলোচনা করা হয়েছে।

সূচক পুনর্নির্মাণ

INSERT, UPDATE, বা DELETE স্টেটমেন্ট ব্যবহার করে ডেটাতে যে কোনো পরিবর্তনের ফলে ডেটা ফ্র্যাগমেন্টেশন হতে পারে। যদি এই ডেটা ইন্ডেক্স করা হয়, তাহলে ইনডেক্স ফ্র্যাগমেন্টেশনও সম্ভব, ইনডেক্স তথ্য বিভিন্ন ফিজিক্যাল পেজ জুড়ে ছড়িয়ে ছিটিয়ে আছে। ইনডেক্স ডেটা ফ্র্যাগমেন্টেশনের ফলে, ডেটাবেস ইঞ্জিনকে অতিরিক্ত ডেটা রিড অপারেশন করতে বাধ্য করা হতে পারে, যা সামগ্রিক সিস্টেমের কার্যকারিতা হ্রাস করে। এই ক্ষেত্রে, আপনাকে সমস্ত খণ্ডিত সূচকগুলি পুনরায় তৈরি করতে হবে।

এটা দুইভাবে সম্পাদন করা যেতে পারে:

    ALTER সূচক স্টেটমেন্টের REBUILD প্যারামিটারের মাধ্যমে;

    CREATE INDEX স্টেটমেন্টের DROP_EXISTING প্যারামিটারের মাধ্যমে।

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

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

DROP_EXISTING বিকল্পটি REBUILD বিকল্পের চেয়ে বেশি শক্তিশালী কারণ এটি আরও নমনীয় এবং বেশ কয়েকটি বিকল্প প্রদান করে, যেমন সূচক তৈরি করে এমন কলামগুলি পরিবর্তন করা এবং একটি নন-ক্লাস্টারড সূচককে একটি ক্লাস্টারে পরিবর্তন করা।

ইনডেক্স নোড পেজ পুনর্গঠন

ALTER INDEX স্টেটমেন্টের REORGANIZE প্যারামিটার নির্দিষ্ট সূচকে নোডগুলির পৃষ্ঠাগুলিকে পুনর্গঠিত করে যাতে পৃষ্ঠাগুলির প্রকৃত ক্রম তাদের যৌক্তিক ক্রম, বাম থেকে ডানে মেলে৷ এটি একটি নির্দিষ্ট পরিমাণ সূচক বিভক্তকরণ দূর করে, সূচক কর্মক্ষমতা উন্নত করে।

সূচক নিষ্ক্রিয় করুন

অক্ষম বিকল্পটি নির্দিষ্ট সূচকটি নিষ্ক্রিয় করে। একটি অক্ষম সূচক ব্যবহার করার জন্য উপলব্ধ নয় যতক্ষণ না এটি আবার সক্রিয় করা হয়৷ মনে রাখবেন যে সংশ্লিষ্ট ডেটাতে পরিবর্তন করা হলে একটি অক্ষম সূচক পরিবর্তন হয় না। এই কারণে, একটি অক্ষম সূচক পুনরায় ব্যবহার করতে, এটি সম্পূর্ণরূপে পুনরায় তৈরি করা আবশ্যক। একটি অক্ষম সূচক সক্রিয় করতে, ALTER TABLE স্টেটমেন্টের REBUILD বিকল্পটি ব্যবহার করুন।

যখন একটি টেবিলে একটি ক্লাস্টারড সূচক নিষ্ক্রিয় করা হয়, তখন টেবিলের ডেটা অ্যাক্সেসযোগ্য হবে না কারণ ক্লাস্টারযুক্ত সূচক সহ টেবিলের সমস্ত ডেটা পৃষ্ঠাগুলি এর ট্রি নোডগুলিতে সংরক্ষণ করা হয়।

সূচীগুলি সরানো এবং পুনঃনামকরণ করা হচ্ছে

বর্তমান ডাটাবেসে সূচী অপসারণ করতে, ব্যবহার করুন ড্রপ ইনডেক্স নির্দেশনা. মনে রাখবেন যে একটি টেবিলে একটি ক্লাস্টারড সূচক ড্রপ করা একটি খুব সম্পদ-নিবিড় অপারেশন হতে পারে কারণ সমস্ত নন-ক্লাস্টারড ইনডেক্স পুনরায় তৈরি করতে হবে। (সমস্ত নন-ক্লাস্টারড ইনডেক্স তাদের নোড পৃষ্ঠাগুলিতে একটি পয়েন্টার হিসাবে ক্লাস্টারযুক্ত সূচকের সূচক কী ব্যবহার করে।) একটি সূচক ড্রপ করার জন্য DROP INDEX স্টেটমেন্ট ব্যবহার করে নীচের উদাহরণে চিত্রিত করা হয়েছে:

স্যাম্পলডিবি ব্যবহার করুন; কর্মচারীর উপর ইনডেক্স ix_empid ড্রপ করুন;

DROP INDEX নির্দেশে একটি অতিরিক্ত আছে প্যারামিটারে যান, যার অর্থ CREATE INDEX স্টেটমেন্টের অন প্যারামিটারের মতো। অন্য কথায়, ক্লাস্টারড ইনডেক্স নোড পৃষ্ঠাগুলিতে থাকা ডেটা সারিগুলি কোথায় সরানো হবে তা নির্দিষ্ট করতে আপনি এই প্যারামিটারটি ব্যবহার করতে পারেন। ডাটা একটি গাদা হিসাবে একটি নতুন অবস্থানে সরানো হয়. আপনি নতুন ডেটা স্টোরেজ অবস্থানের জন্য একটি ডিফল্ট ফাইলগ্রুপ বা একটি নামযুক্ত ফাইলগ্রুপ নির্দিষ্ট করতে পারেন।

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

sp_rename সিস্টেম পদ্ধতি ব্যবহার করে ইনডেক্সের নাম পরিবর্তন করা যেতে পারে।

ডাটাবেস ডায়াগ্রাম বা অবজেক্ট এক্সপ্লোরার ব্যবহার করে ম্যানেজমেন্ট স্টুডিওতে ইনডেক্সগুলি তৈরি, পরিবর্তন এবং মুছে ফেলা যেতে পারে। তবে সবচেয়ে সহজ উপায় হল প্রয়োজনীয় টেবিলের ইনডেক্স ফোল্ডারটি ব্যবহার করা। ম্যানেজমেন্ট স্টুডিওতে সূচী পরিচালনা করা ম্যানেজমেন্ট স্টুডিওতে টেবিল পরিচালনা করার অনুরূপ।

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

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

সূচী এবং যেখানে ধারা শর্তাবলী

যদি একটি SELECT স্টেটমেন্টের WHERE ক্লজে একটি কলাম সহ একটি অনুসন্ধান শর্ত থাকে, তাহলে সেই কলামে একটি সূচক তৈরি করা উচিত। এটি বিশেষ করে উচ্চ নির্বাচনী অবস্থার অধীনে সুপারিশ করা হয়। একটি শর্তের নির্বাচনের দ্বারা আমরা সারিগুলির সংখ্যার অনুপাতকে বোঝায় যা সারণির মোট সারির সংখ্যার সাথে শর্তটি পূরণ করে। উচ্চ সিলেক্টিভিটি এই অনুপাতের কম মানের সাথে মিলে যায়। একটি সূচীযুক্ত কলাম ব্যবহার করে অনুসন্ধান প্রক্রিয়াকরণ সবচেয়ে সফল হবে যখন শর্ত নির্বাচনযোগ্যতা 5% এর কম হয়।

শর্তের সিলেক্টিভিটি লেভেল 80% বা তার বেশি হলে একটি কলাম ইন্ডেক্স করা উচিত নয়। এই ক্ষেত্রে, সূচী পৃষ্ঠাগুলির জন্য অতিরিক্ত I/O ক্রিয়াকলাপগুলির প্রয়োজন হবে, যা সূচী ব্যবহার করে যে কোনো সময় সাশ্রয় কমিয়ে দেবে। এই ক্ষেত্রে, টেবিলটি স্ক্যান করে অনুসন্ধান করা দ্রুততর, যা সাধারণত কোয়েরি অপ্টিমাইজার বেছে নেয়, সূচকটিকে অকেজো করে দেয়।

যদি একটি ঘন ঘন ব্যবহৃত ক্যোয়ারী সার্চ কন্ডিশনে AND অপারেটর থাকে, তাহলে আপনার সবচেয়ে ভালো বাজি হল SELECT স্টেটমেন্টের WHERE ক্লজে উল্লেখিত সমস্ত টেবিল কলামে একটি যৌগিক সূচক তৈরি করা। এই ধরনের একটি যৌগিক সূচক তৈরি করা নীচের উদাহরণে দেখানো হয়েছে:

এই উদাহরণটি WHERE ক্লজের সমস্ত কলামে একটি যৌগিক সূচক তৈরি করে। এই ক্যোয়ারীতে, দুটি শর্ত একসাথে AND করা হয়েছে, তাই এই অবস্থায় উভয় কলামে আপনার একটি যৌগিক নন-ক্লাস্টার সূচক তৈরি করা উচিত।

সূচী এবং যোগদান অপারেটর

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

নীচের উদাহরণটি দেখায় যে কীভাবে সূচীগুলি তৈরি করতে হয় যা ব্যবহার করা হবে যদি আপনার একটি যোগদান অপারেশন এবং একটি অতিরিক্ত ফিল্টার সহ একটি প্রশ্ন থাকে:

কভারিং সূচক

পূর্বে উল্লিখিত হিসাবে, একটি সূচকের সমস্ত ক্যোয়ারী কলাম সহ ক্যোয়ারী কর্মক্ষমতা উল্লেখযোগ্যভাবে উন্নত করতে পারে। এই ধরনের একটি সূচক তৈরি করা, যাকে কভারিং বলা হয়, নীচের উদাহরণে দেখানো হয়েছে:

অ্যাডভেঞ্চার ওয়ার্কস 2012 ব্যবহার করুন; GO DROP INDEX Person.Address.IX_Address_StateProvinceID; যান INDEX ix_address_zip ON Person.Address(PostalCode) Include(City, State ProvinceID); ব্যক্তি থেকে শহর, রাজ্য প্রদেশ আইডি নির্বাচন করুন। ঠিকানা যেখানে পোস্টাল কোড = 84407;

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

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

গণনা করা কলামে সূচী

ডাটাবেস ইঞ্জিন আপনাকে নিম্নলিখিত বিশেষ ধরনের সূচী তৈরি করতে দেয়:

    ইনডেক্সড ভিউ;

    ফিল্টারযোগ্য সূচক;

    গণনা করা কলামে সূচী;

    বিভাজিত সূচক;

    কলাম অধ্যবসায় সূচক;

    XML সূচক;

    পূর্ণ-পাঠ্য সূচী।

এই বিভাগে গণনা করা কলাম এবং তাদের সংশ্লিষ্ট সূচী নিয়ে আলোচনা করা হয়েছে।

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

ভার্চুয়াল গণনা করা কলাম

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

স্যাম্পলডিবি ব্যবহার করুন; টেবিল অর্ডার তৈরি করুন (OrderId INT NOT NULL, মূল্য MONEY NOT NULL, পরিমাণ INT NOT NULL, অর্ডারের তারিখ DATETIME NOT NULL, মূল্য হিসাবে মোট * পরিমাণ, DATEADD হিসাবে পাঠানোর তারিখ (দিন, 7, অর্ডারের তারিখ));

এই উদাহরণে অর্ডার টেবিলে দুটি ভার্চুয়াল গণনা করা কলাম রয়েছে: মোট এবং শিপডডেট। মোট কলামটি অন্য দুটি কলাম, মূল্য এবং পরিমাণ ব্যবহার করে গণনা করা হয় এবং DATEADD ফাংশন এবং অর্ডারডেট কলাম ব্যবহার করে শিপডডেট কলাম গণনা করা হয়।

ধ্রুবক গণনা করা কলাম

ডেটাবেস ইঞ্জিন আপনাকে নির্ধারক গণনা করা কলামগুলিতে সূচী তৈরি করতে দেয় যেখানে অন্তর্নিহিত কলামগুলির সুনির্দিষ্ট ডেটা প্রকার রয়েছে। (একটি গণনা করা কলামকে নির্ধারক বলা হয় যদি এটি সর্বদা একই টেবিলের ডেটার জন্য একই মান প্রদান করে।)

একটি সূচী গণনা করা কলাম শুধুমাত্র তখনই তৈরি করা যেতে পারে যদি SET স্টেটমেন্টের নিম্নলিখিত প্যারামিটারগুলি ON-এ সেট করা থাকে (এই প্যারামিটারগুলি নিশ্চিত করে যে কলামটি নির্ধারক):

    QUOTED_IDENTIFIER

    CONCAT_NULL_YIELDS_NULL

উপরন্তু, NUMERIC_ROUNDABORT প্যারামিটার বন্ধ করতে হবে।

আপনি যদি একটি গণনা করা কলামে একটি ক্লাস্টারযুক্ত সূচক তৈরি করেন, তবে কলামের মানগুলি সংশ্লিষ্ট টেবিলের সারিতে উপস্থিত থাকবে কারণ ক্লাস্টারযুক্ত সূচকের নোড পৃষ্ঠাগুলিতে ডেটা সারি থাকে। নিম্নলিখিত উদাহরণটি অর্ডার টেবিল থেকে গণনা করা কলামের মোট একটি ক্লাস্টার সূচক তৈরি করে:

স্যাম্পলডিবি ব্যবহার করুন; অর্ডারে ক্লাস্টারড ইনডেক্স ix1 তৈরি করুন (মোট);

CREATE INDEX স্টেটমেন্ট কার্যকর করার পরে, গণনা করা মোট কলামটি সারণিতে উপস্থিত থাকবে। এর মানে হল যে একটি গণনা করা কলামের অন্তর্নিহিত কলামগুলির সমস্ত আপডেট এটিকে আপডেট করবে৷

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

নতুনদের জন্য এই নিবন্ধে, আমি SQL কোয়েরি চালানোর গতি বাড়ানোর জন্য প্রয়োজনীয় সূচকগুলি কীভাবে নির্ধারণ করতে হয় তা দেখব।

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

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

বিঃদ্রঃ: এটি অনুমান করে যে প্রশ্নগুলি নিজেরাই কম-বেশি সর্বোত্তমভাবে তৈরি করা হয়েছে, উদাহরণস্বরূপ, নির্বাচন , ইত্যাদিতে কোনও অতিরিক্ত ক্ষেত্র নেই৷

পূর্ণসংখ্যা শনাক্তকারী ক্ষেত্রগুলির জন্য সূচক।

যদি আপনার কাছে একটি পূর্ণসংখ্যা শনাক্তকারীর একটি ক্ষেত্র থাকে (এটি টেবিলের শনাক্তকারী বা অন্য টেবিলের একটি সারির দিকে নির্দেশ করে এমন একটি শনাক্তকারী কিনা তা বিবেচ্য নয়), তারপর এটির জন্য একটি পৃথক সূচক তৈরি করুন৷

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

যদি প্রথম ক্ষেত্রে সবকিছু বেশ সহজ এবং পরিষ্কার হয়, তবে দ্বিতীয় ক্ষেত্রে (একটি রেফারেন্স বই সহ) আমি একটি সাধারণ উদাহরণ দেব।

ধরা যাক দুটি টেবিল রয়েছে: নিবন্ধ (নিবন্ধ - আইডি, নাম, পাঠ্য) এবং মন্তব্য (মন্তব্য - আইডি, নিবন্ধ_আইডি, পাঠ্য)। প্রথম টেবিলে 200টি রেকর্ড (নিবন্ধ), দ্বিতীয় টেবিলে 2000টি রেকর্ড রয়েছে (প্রতিটি নিবন্ধের জন্য 10টি মন্তব্য)। তদনুসারে, যখন প্রতিটি ব্যবহারকারী কোনো নিবন্ধ খোলে, নিম্নলিখিত প্রশ্নটি কার্যকর করা হয়:

যদি sql ক্যোয়ারীটি article_id ক্ষেত্রের জন্য একটি সূচী ছাড়াই চালানো হয়, তাহলে মন্তব্য সহ সম্পূর্ণ টেবিলটি (সমস্ত 2000 রেকর্ড) প্রতিবার সম্পূর্ণভাবে স্ক্যান করা হবে। যদি article_id ক্ষেত্রের জন্য একটি সূচী যোগ করা হয়, তাহলে ডাটাবেসকে 20টির বেশি রেকর্ড দেখতে হবে না (সুনির্দিষ্টভাবে বলতে গেলে, সবচেয়ে খারাপ ক্ষেত্রে প্রায় 18টি)। এখানে হিসাব সহজ। সবচেয়ে খারাপ ক্ষেত্রে, রেকর্ডের সংখ্যা + একই সূচক ক্ষেত্রের মান সহ রেকর্ডের সংখ্যার বাইনারি লগারিদমের গতিতে একটি সূচক অনুসন্ধান ঘটে। এই ক্ষেত্রে, প্রতিটি নিবন্ধে 10টি রেকর্ড রয়েছে (তাদের মানগুলি পুনরাবৃত্তি করা হয়েছে) + 200টির log2 (যেহেতু শুধুমাত্র 200টি নিবন্ধ আছে = 2000/10) = 10 + 8 (বৃত্তাকার) = 18।

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

বিঃদ্রঃ: যাইহোক, মনে রাখবেন যে এটি বিশেষভাবে পূর্ণসংখ্যা সূচকের ক্ষেত্রে প্রযোজ্য, এবং "আমাকে সমস্ত সম্ভাব্য ক্ষেত্রের জন্য সূচী তৈরি করতে দিন" বিকল্পে নয়।

সবচেয়ে সাধারণ প্রশ্নের জন্য সহজ এবং যৌগিক সূচী।

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

অতএব, পর্যায়ক্রমে ঘন ঘন সঞ্চালিত প্রশ্নের জন্য নিয়মিত এবং যৌগিক সূচীগুলি তৈরি করার অর্থ হতে পারে। এর দুটি উদাহরণ তাকান.

সরল সূচক।

ধরা যাক আপনার একটি টেবিল আছে - পণ্য (পণ্য - আইডি, কোড, নাম, পাঠ্য)। এবং এটি তাই ঘটে যে সাইট ব্যবহারকারীরা প্রায়শই তাদের আলফানিউমেরিক কোড (নিবন্ধ - কোড ক্ষেত্র) দ্বারা পণ্যগুলি অনুসন্ধান করে। তদনুসারে, অনুরোধটি এরকম কিছু দেখায়:

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

যৌগিক সূচক।

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

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

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

প্রচুর সংখ্যক রেকর্ড এবং ঘন ঘন কলের জন্য, এটি একটি অত্যন্ত ব্যয়বহুল sql কোয়েরি। অতএব, এই ক্ষেত্রে, একটি যৌগিক সূচক তৈরি করা মূল্যবান, উদাহরণস্বরূপ, (user_id, cat_id) এই ক্ষেত্রে, ব্যবহারকারী দ্বারা অনুসন্ধান করার পরে, বিভাগ দ্বারা পরবর্তী অনুসন্ধান দ্রুত হবে, কারণ ফলাফলের জন্য একটি সূচকও থাকবে। রেকর্ড তদনুসারে, 1000টি রেকর্ড চেক করার পরিবর্তে, উল্লেখযোগ্যভাবে কম পরীক্ষা করা হবে (চেকগুলি নিয়মিত সূচকের মতো একইভাবে গণনা করা হয় - লগারিদম + রেকর্ডের সংখ্যা)।

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

ব্যবহারকারীদের বাছাই করা রেকর্ডের গড় সংখ্যা গণনা করুন -- রেকর্ডের গড় সংখ্যা (data.count) থেকে গড় হিসাবে -- শনাক্তকারীর দ্বারা সমস্ত রেকর্ডকে গোষ্ঠীভুক্ত করুন (সংখ্যা (*) নিবন্ধ থেকে `গণনা` হিসাবে নির্বাচন করুন -- ব্যবহারকারীদের দ্বারা গোষ্ঠী দ্বারা গোষ্ঠী user_id) ডেটা হিসাবে ; -- বিভাগ নির্বাচনের জন্য রেকর্ডের গড় সংখ্যা গণনা করুন -- থেকে গড় হিসাবে রেকর্ডের গড় সংখ্যা avg(data.count) -- শনাক্তকারী দ্বারা সমস্ত রেকর্ডকে গোষ্ঠীভুক্ত করুন (সংখ্যা(*) নিবন্ধ থেকে `গণনা' হিসাবে নির্বাচন করুন -- বিভাগ অনুসারে গোষ্ঠী cat_id দ্বারা গোষ্ঠী ) ডেটা হিসাবে;

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

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

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

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

উদাহরণস্বরূপ, যদি আপনি একটি নির্দিষ্ট বিষয়ে একটি বইয়ের সমস্ত পৃষ্ঠার লিঙ্ক চান, তাহলে প্রথমে সূচীটি দেখুন, যা বর্ণানুক্রমিক ক্রমে সমস্ত বিষয় তালিকাভুক্ত করে এবং তারপরে এক বা একাধিক নির্দিষ্ট পৃষ্ঠা নম্বর উল্লেখ করে৷

সূচকটি প্রশ্ন এবং বাক্যগুলির গতি বাড়াতে সাহায্য করে, তবে এটি বিবৃতি সহ ডেটা এন্ট্রিকে ধীর করে দেয় হালনাগাদএবং ঢোকান. তথ্য প্রভাবিত না করেই ইনডেক্স তৈরি বা মুছে ফেলা যেতে পারে।

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

সীমাবদ্ধতা সহ সূচকগুলিও অনন্য হতে পারে অনন্য, যাতে সূচী একটি কলামে বা কলামের সংমিশ্রণে সদৃশ এন্ট্রি প্রতিরোধ করে যেটিতে একটি সূচক রয়েছে।

INDEX কমান্ড তৈরি করুন

মৌলিক সিনট্যাক্স সূচক তৈরি করুননিম্নরূপ:

টেবিল_নামের উপর INDEX index_name তৈরি করুন;

একক-কলাম সূচী

টেবিলের শুধুমাত্র একটি কলামে একটি একক-কলাম সূচক তৈরি করা হয়। মৌলিক সিনট্যাক্স নিম্নরূপ।

টেবিল_নাম(কলাম_নাম) তে INDEX index_name তৈরি করুন;

অনন্য সূচক

অনন্য সূচকগুলি শুধুমাত্র অপারেশনের জন্য নয়, ডেটা অখণ্ডতা নিশ্চিত করতেও ব্যবহৃত হয়। একটি অনন্য সূচক টেবিলের মধ্যে কোনো ডুপ্লিকেট মান সন্নিবেশ করার অনুমতি দেয় না। মৌলিক সিনট্যাক্স নিম্নরূপ।

টেবিল_নাম(কলাম_নাম) এ অনন্য সূচক সূচক_নাম তৈরি করুন;

কম্পোজিট ইনডেক্স

একটি যৌগিক সূচক একটি টেবিলের দুই বা ততোধিক কলামের একটি সূচক। এর মৌলিক সিনট্যাক্স নিম্নরূপ।

টেবিল_নাম (কলাম 1, কলাম 2) এ INDEX index_name তৈরি করুন;

আপনি একটি একক কলাম বা একটি যৌগিক সূচীতে একটি সূচক তৈরি করুন না কেন, কলাম(গুলি) বিবেচনা করুন যা আপনি একটি ফিল্টার শর্ত হিসাবে একটি WHERE কোয়েরিতে প্রায়শই ব্যবহার করতে পারেন৷

যদি শুধুমাত্র একটি কলাম ব্যবহার করা হয়, তাহলে একটি কলামে একটি সূচক নির্বাচন করতে হবে। যদি দুই বা ততোধিক কলাম থাকে যা প্রায়শই WHERE ক্লজে ফিল্টার হিসাবে ব্যবহৃত হয়, তাহলে একটি যৌগিক সূচক একটি ভাল পছন্দ হবে।

অন্তর্নিহিত সূচক

অন্তর্নিহিত সূচীগুলি এমন সূচীগুলি যা ডেটাবেস সার্ভারে স্বয়ংক্রিয়ভাবে তৈরি হয় যখন একটি বস্তু তৈরি হয়। প্রাথমিক কী এবং অনন্য সীমাবদ্ধতায় সূচীগুলি স্বয়ংক্রিয়ভাবে তৈরি হয়।

ড্রপ ইনডেক্স কমান্ড

এসকিউএল কমান্ড ব্যবহার করে সূচক মুছে ফেলা যেতে পারে ড্রপ. একটি সূচক মুছে ফেলার সময় আপনার সতর্কতা অবলম্বন করা উচিত কারণ কর্মক্ষমতা হয় ধীর বা ভাল হতে পারে।

মৌলিক সিনট্যাক্স এই মত দেখায়:

DROP INDEX index_name;

আপনি সূচকের কিছু বাস্তব উদাহরণ দেখতে INDEX সীমাবদ্ধতার উদাহরণ দেখতে পারেন।

আপনি কখন সূচক এড়াতে হবে?

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

নিম্নলিখিত নির্দেশাবলী নির্দেশ করে যে কখন সূচক ব্যবহার পুনর্বিবেচনা করা উচিত।

  • ছোট টেবিলে সূচী ব্যবহার করা উচিত নয়।
  • ঘন ঘন বড় আপডেট বা সন্নিবেশ অপারেশন আছে যে টেবিল.
  • সূচীগুলি এমন কলামগুলিতে ব্যবহার করা উচিত নয় যেখানে প্রচুর সংখ্যক শূন্য মান রয়েছে৷
  • যে কলামগুলি প্রায়শই ম্যানিপুলেট করা হয় সেগুলিকে ইন্ডেক্স করা উচিত নয়৷


শেয়ার করুন