MS sql সূচক। এসকিউএল সার্ভার - মাইক্রোসফ্ট এসকিউএল-এ একটি কভারিং সূচক তৈরি করার সময় কি অর্ডার গুরুত্বপূর্ণ? ধ্রুবক গণনা করা কলাম

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

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

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

--গুচ্ছ সূচীগুলি নন-ক্লাস্টার সূচকগুলির তুলনায় দ্রুত ডেটা পুনরুদ্ধার প্রদান করে। আপডেট করার সময় তারা সাধারণত দ্রুত হতে পারে, কিন্তু যখন সম্পর্কের মাঝখানে একই জায়গায় অনেকগুলি আপডেট ঘটছে তখন নয়।

--কিছু কারণে, একটি ক্লাস্টারযুক্ত সূচক একটি নন-ক্লাস্টারড সূচকের চেয়ে দ্রুত চলে। যখন সিস্টেম একটি ক্লাস্টারড ইনডেক্স স্ক্যান করে, তখন ডাটা পৃষ্ঠাগুলি স্ক্যান করার জন্য B-tree স্ট্রাকচার ছেড়ে যাওয়ার দরকার নেই কারণ এই জাতীয় পৃষ্ঠাগুলি ইতিমধ্যেই গাছের পাতার স্তরে উপস্থিত রয়েছে।

--একটি নন-ক্লাস্টারড সূচকের জন্য সংশ্লিষ্ট ক্লাস্টারযুক্ত সূচকের চেয়ে আরও বেশি I/O অপারেশন প্রয়োজন।

--বি-ট্রি স্ক্যান করার পরে নন-ক্লাস্টারড ইনডেক্সের ডেটা পৃষ্ঠাগুলি পড়তে হবে বা, যদি টেবিলের অন্য কলামে (গুলি) একটি ক্লাস্টারড ইনডেক্স থাকে, তাহলে নন-ক্লাস্টারড ইনডেক্সকে ক্লাস্টারড ইনডেক্সের বি-ট্রি স্ট্রাকচার পড়তে হবে .

--সুতরাং একটি ক্লাস্টারড ইনডেক্স একটি টেবিল স্ক্যানের তুলনায় উল্লেখযোগ্যভাবে দ্রুত হবে, এমনকি যদি এর নির্বাচনযোগ্যতা বেশ খারাপ হয় (কোয়েরিটি অনেক সারি প্রদান করে)

tsql.dbo.NI টেবিল তৈরি করুন
আইডি শূন্য নয়,
T char(8) NULL
);

টেবিল tsql.dbo.NCI তৈরি করুন
আইডি শূন্য নয়,
T char(8) NULL
);

-- একটি ক্লাস্টার সূচক তৈরি করুন

ক্লাস্টারড ইনডেক্স IX_1 তৈরি করুন
tsql.dbo.NCI(ID);

--একটি টেবিলে একটি নন-ক্লাস্টারড সূচক তৈরি করুন

অক্লাস্টার্ড সূচক IX_2 তৈরি করুন
tsql.dbo.NCI(T);

--পরীক্ষার তথ্য যোগ করুন
ডিক্লেয়ার @i INT = 100000;
ঘোষণা করুন @t CHAR(1) = "T";

যখন @i > 0
শুরু
tsql.dbo.NI মানগুলিতে সন্নিবেশ করান(@i, @t + CAST(@i AS char(6)));
tsql.dbo.NCI মানগুলিতে সন্নিবেশ করান(@i, @t + CAST(@i AS char(6)));
SET @i -= 1;
শেষ

--সূচী সহ একটি টেবিলে প্রশ্ন
tsql.dbo.NCI থেকে আইডি নির্বাচন করুন
আইডি দ্বারা অর্ডার, টি

আইডি নির্বাচন করুন, tsql.dbo.NCI থেকে কাউন্ট(*) সি হিসেবে
আইডি দ্বারা গ্রুপ, টি

tsql.dbo.NCI থেকে আইডি নির্বাচন করুন
WHERE ID > 4000 এবং ID< 55000 AND T LIKE "T%"

-- উভয় সূচী ব্যবহার করে কোয়েরি
tsql ব্যবহার করুন;
কাস্ট নির্বাচন করুন (ভারচার হিসাবে dbo.NCI.ID)
dbo.NCI থেকে
dbo.NCI.ID দ্বারা গ্রুপ
ইউনিয়ন সব
dbo.NCI.T নির্বাচন করুন
dbo.NCI থেকে
dbo.NCI.T দ্বারা গ্রুপ

-- সূচক তথ্য
index_type_desc, index_depth, index_level, নির্বাচন করুন
পৃষ্ঠা_গণনা, রেকর্ড_গণনা
sys.dm_db_index_physical_stats থেকে
(DB_ID(N"tsql"), OBJECT_ID(N"dbo.NCI"), NULL, NULL , "DETAILED");

--সূচী মুছে ফেলা হচ্ছে
যদি বিদ্যমান থাকে (sys.indexes থেকে নাম নির্বাচন করুন
কোথায় নাম = N"IX_1")
tsql.dbo.NCI-এ ড্রপ ইনডেক্স IX_1;

যদি বিদ্যমান থাকে (sys.indexes থেকে নাম নির্বাচন করুন
কোথায় নাম = N"IX_2")
tsql.dbo.NCI তে ইনডেক্স IX_2 ড্রপ করুন;

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

আমি আপনাকে স্টাফ টেবিল স্কিমার সংজ্ঞা মনে করিয়ে দিই যেটির সাথে আমরা কাজ করব:

স্টাফ টেবিল

ধরা যাক আমাদের স্টাফ টেবিলের জন্য একটি নন-ক্লাস্টারড সূচক তৈরি করতে হবে, যা নিম্নলিখিত ক্যোয়ারীটিকে অপ্টিমাইজ করবে:

স্টাফ থেকে আইডি, নাম, চাকরি নির্বাচন করুন যেখানে বেতন > 1000 এবং ছবি শূন্য নয়

সূচী কী হবে বেতন এবং ফটো কলাম, যেহেতু নির্বাচন এই ক্ষেত্রগুলি দ্বারা ফিল্টার করা হয়। এবং আইডি, নাম এবং কাজের কলামগুলি সূচীতে অন্তর্ভুক্ত কলাম হবে।

সাধারণ কমান্ড সিনট্যাক্স নিম্নরূপ:

ব্যবহার করুন যাওয়া

নন-ক্লাস্টার্ড ইনডেক্স তৈরি করুন চালু (ASC -- সূচক কী কলাম)

অন্তর্ভুক্ত করুন ( -- অন্তর্ভুক্ত কলাম) GO

আমাদের ক্ষেত্রে, অনুরোধটি এরকম দেখাবে:

(বেতন, ছবি) ইনক্লুড (আইডি, নাম, চাকরি) যান

আমরা একটি নন-ক্লাস্টারড ইনডেক্স তৈরি করেছি। অথবা বরং, একটি নন-ক্লাস্টারড কভারিং সূচক। এর মানে হল যে সূচীতে ক্যোয়ারী চালানোর জন্য প্রয়োজনীয় সমস্ত ক্ষেত্র রয়েছে এবং কোয়েরি চালানোর সময় SQL সার্ভার বেস টেবিলে প্রবেশ করবে না।

যদি আমাদের কোড এই মত ছিল:

তৈরি করুন নন-ক্লাস্টার্ড ইনডেক্স IDX_StaffsSearch on Stuffs

(বেতন, ছবি) ইনক্লুড (আইডি) যান

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

ক্লাস্টার ইনডেক্স নিম্নলিখিত কমান্ড ব্যবহার করে তৈরি করা হয়:

স্টাফগুলিতে ক্লাস্টারড ইনডেক্স IDX_Stsffsid তৈরি করুন (আইডি)

এখানে টেবিলের প্রাথমিক কী (আইডি কলাম) এর উপর ভিত্তি করে একটি অনন্য ক্লাস্টারযুক্ত সূচক তৈরি করা হয়েছিল।

বাস্তব উদাহরণ

আসুন এখন এমন একটি দৃশ্যকল্প তৈরি করি যেখানে আমরা সূচী ব্যবহার করার ক্ষেত্রে কার্যক্ষমতা লাভের মাত্রাকে বাস্তবসম্মতভাবে মূল্যায়ন করতে পারি।

আসুন একটি নতুন ডাটাবেস তৈরি করি:

ডেটাবেস টেস্টডিবি তৈরি করুন;

এবং একটি একক গ্রাহক টেবিল, যা চারটি কলাম নিয়ে গঠিত হবে:

ছক তৈরি কর .(

NULL, NULL, NULL, NULL) যান

এখন র‍্যান্ডম ডেটা দিয়ে আমাদের টেবিলটি পূরণ করা যাক। আইডি কলামটি একটি লুপে বাড়ানো হবে, এবং টেবিলের বাকি তিনটি কলাম র্যান্ডম ফাংশনের একটি অদ্ভুত সংস্করণ ব্যবহার করে এলোমেলো সংখ্যা দিয়ে পূর্ণ হবে:

ঘোষণা করুন @i int = 0;

যখন আমি< 500000) BEGIN INSERT INTO Customers(Id, Num1, Num2, Num3) VALUES(

@i, abs(checksum(newid())), abs(checksum(newid())), abs(checksum(newid())) SET @i = @i + 1; শেষ

এই স্ক্রিপ্টটি টেবিলে অর্ধ মিলিয়ন রেকর্ড যোগ করে, তাই ধৈর্য ধরুন, স্ক্রিপ্টটি কমপক্ষে 3 মিনিটের জন্য চলবে।

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

পরিসংখ্যান সংগ্রহ মোড সক্ষম করতে, আপনাকে অবশ্যই নিম্নলিখিত কমান্ডটি চালাতে হবে:

এখন, প্রতিটি অনুরোধ কার্যকর করার পরে, বার্তা ট্যাবে আমাদের এই অনুরোধটি কার্যকর করার পরিসংখ্যানে অ্যাক্সেস থাকবে, যেমনটি নীচে দেখানো হয়েছে:

আমরা শুধুমাত্র লজিক্যাল রিড প্যারামিটারের মান নিয়ে আগ্রহী।

সুতরাং, আমাদের টেবিলে এখনও কোন সূচী নেই। আসুন নিম্নলিখিত তিনটি প্রশ্ন চালাই এবং নীচের ফলাফল টেবিলে প্রতিটি প্রশ্নের জন্য লজিক্যাল রিডের সংখ্যা রেকর্ড করি:

1) গ্রাহকদের থেকে আইডি, নম্বর 1, নম্বর 2 নির্বাচন করুন যেখানে আইডি = 2000

2) আইডি >= 0 এবং আইডি যেখানে গ্রাহকদের থেকে আইডি, নম্বর 1, নম্বর 2 নির্বাচন করুন< 1000

3) আইডি >= 0 এবং আইডি যেখানে গ্রাহকদের থেকে আইডি, নম্বর 1, নম্বর 2 নির্বাচন করুন< 5000

এই প্রশ্নগুলি যথাক্রমে 1 সারি, 1000 সারি এবং 5000 সারি প্রদান করবে। সূচী ব্যতীত, সমস্ত প্রশ্নের জন্য কর্মক্ষমতা সূচক (লজিক্যাল রিডের সংখ্যা) একই এবং 1621 এর সমান। ফলাফল টেবিলে ডেটা প্রবেশ করা যাক:

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

এখন এর একটি কভারিং সূচক তৈরি করা যাক, যার ফলে সর্বাধিক কর্মক্ষমতা অর্জন করা যায়।

প্রথমে, আগের সূচকটি মুছে ফেলা যাক:

TestDB GO DROP INDEX Customers.TestIndex1 ব্যবহার করুন

এবং আসুন একটি নতুন সূচক তৈরি করি:

dbo.Customers(Id) ইনক্লুড (Num1, Num2);

এখন তৃতীয়বার আমাদের প্রশ্নগুলি চালাই এবং ফলাফলগুলি একটি টেবিলে লিখি:

কোনো সূচক নেই

নন-কভারিং সূচক

কভারিং সূচক

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

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

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

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

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

দরকারী সূচক

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

উদাহরণস্বরূপ, UnitPrice কলামে একটি সূচক তৈরি করার সময় Northwind ডাটাবেসের বিরুদ্ধে নিম্নলিখিত প্রশ্নগুলি আরও দক্ষতার সাথে চলবে।

পণ্য থেকে মুছুন যেখানে UnitPrice=1
পণ্য থেকে * নির্বাচন করুন যেখানে ইউনিট মূল্য 14 এবং 16 এর মধ্যে

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

UnitPrice ASC দ্বারা পণ্য অর্ডার থেকে * নির্বাচন করুন

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

UnitPrice দ্বারা পণ্য গ্রুপ থেকে গণনা(*), ইউনিটমূল্য নির্বাচন করুন

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

ইনডেক্সিং এর অসুবিধা

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

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

একটি সর্বোত্তম সূচক নির্মাণ

সরল সূচক

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

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

নির্বাচনী সূচক

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

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

কভারিং ইনডেক্স

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

আসুন UnitPrice কলামে একটি সূচক বিবেচনা করি, যা উপরে উল্লিখিত হয়েছে। পরবর্তী ক্যোয়ারী চালানোর জন্য DBMS শুধুমাত্র সূচক আইটেম ব্যবহার করতে পারে।

UnitPrice দ্বারা পণ্য গোষ্ঠী থেকে Count(*), UnitPrice নির্বাচন করুন

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

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

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

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

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

উপসংহার

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

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

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


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

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

সূচকের ধরন

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

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

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

এবং এখন, আসলে:

SQL সার্ভারে সূচী সম্পর্কে 14টি প্রশ্ন যা আপনি জিজ্ঞাসা করতে বিব্রত ছিলেন

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

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

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

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

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

ডিফল্ট ইনডেক্স ফিল ফ্যাক্টর পরিবর্তন করা এক জিনিস। ডিফল্ট অনুপাত কিভাবে কাজ করে তা বোঝা অন্য বিষয়। কিন্তু প্রথমে, কয়েক ধাপ পিছিয়ে যান। ইনডেক্স ফিল ফ্যাক্টর একটি নতুন পৃষ্ঠা পূরণ শুরু করার আগে নীচের স্তরে (পাতার স্তরে) সূচকটি সংরক্ষণ করার জন্য পৃষ্ঠায় স্থানের পরিমাণ নির্ধারণ করে। উদাহরণস্বরূপ, যদি সহগটি 90 এ সেট করা হয়, তাহলে যখন সূচকটি বৃদ্ধি পাবে, তখন এটি পৃষ্ঠার 90% দখল করবে এবং তারপরে পরবর্তী পৃষ্ঠায় চলে যাবে।
ডিফল্টরূপে, ইনডেক্স ফিল ফ্যাক্টর মান আছে SQL সার্ভার 0, যা 100 এর সমান। ফলস্বরূপ, সমস্ত নতুন সূচী স্বয়ংক্রিয়ভাবে এই সেটিংটির উত্তরাধিকারী হয় যদি না আপনি নির্দিষ্টভাবে আপনার কোডে একটি মান নির্দিষ্ট করেন যা সিস্টেমের মান মান থেকে আলাদা বা ডিফল্ট আচরণ পরিবর্তন করে। তুমি ব্যবহার করতে পার এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওডিফল্ট মান সামঞ্জস্য করতে বা একটি সিস্টেম সঞ্চিত পদ্ধতি চালাতে sp_configure. উদাহরণস্বরূপ, নিম্নলিখিত সেট টি-এসকিউএলকমান্ড সহগ মান 90 এ সেট করে (আপনাকে প্রথমে উন্নত সেটিংস মোডে স্যুইচ করতে হবে):
EXEC sp_configure "উন্নত বিকল্পগুলি দেখান", 1; পুনরায় কনফিগার করুন; GO EXEC sp_configure "ফিল ফ্যাক্টর", 90; পুনরায় কনফিগার করুন; যাওয়া
ইনডেক্স ফিল ফ্যাক্টর মান পরিবর্তন করার পরে, আপনাকে পরিষেবাটি পুনরায় চালু করতে হবে SQL সার্ভার. আপনি এখন নির্দিষ্ট দ্বিতীয় আর্গুমেন্ট ছাড়া sp_configure চালিয়ে সেট মান পরীক্ষা করতে পারেন:
EXEC sp_configure "ফিল ফ্যাক্টর" GO
এই কমান্ডটি 90 এর একটি মান প্রদান করবে। ফলস্বরূপ, সমস্ত নতুন তৈরি ইনডেক্স এই মান ব্যবহার করবে। আপনি একটি সূচক তৈরি করে এবং ফিল ফ্যাক্টর মানের জন্য অনুসন্ধান করে এটি পরীক্ষা করতে পারেন:
অ্যাডভেঞ্চার ওয়ার্কস 2012 ব্যবহার করুন; -- আপনার ডাটাবেস যান অক্লাষ্টার্ড ইনডেক্স তৈরি করুন ix_people_lastname on Person.Person(Last Name); sys.indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং name="ix_people_lastname";
এই উদাহরণে, আমরা একটি টেবিলে একটি নন-ক্লাস্টারড সূচক তৈরি করেছি ব্যক্তিডাটাবেসে অ্যাডভেঞ্চার ওয়ার্কস 2012. ইনডেক্স তৈরি করার পর, আমরা sys.indexes সিস্টেম টেবিল থেকে ফিল ফ্যাক্টর মান পেতে পারি। ক্যোয়ারী 90 রিটার্ন করা উচিত.
যাইহোক, আসুন কল্পনা করি যে আমরা সূচকটি মুছে ফেলেছি এবং এটি আবার তৈরি করেছি, কিন্তু এখন আমরা একটি নির্দিষ্ট ফিল ফ্যাক্টর মান উল্লেখ করেছি:
Person.Person(Last Name) এর সাথে (fillfactor=80); sys.indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং name="ix_people_lastname";
এবার আমরা নির্দেশনা যোগ করেছি সঙ্গেএবং বিকল্প গুণক পরিপূর্ণ করাআমাদের সূচক তৈরির অপারেশনের জন্য সূচক তৈরি করুনএবং মান 80 উল্লেখ করেছেন। অপারেটর নির্বাচন করুনএখন সংশ্লিষ্ট মান প্রদান করে।
এখন পর্যন্ত, সবকিছু বেশ সহজবোধ্য হয়েছে। যেখানে আপনি সত্যিই এই পুরো প্রক্রিয়ায় পুড়ে যেতে পারেন যখন আপনি একটি সূচক তৈরি করেন যা একটি ডিফল্ট সহগ মান ব্যবহার করে, ধরে নিই যে আপনি সেই মানটি জানেন। উদাহরণ স্বরূপ, কেউ সার্ভার সেটিংসের সাথে টিঙ্কার করছে এবং এতটাই একগুঁয়ে যে তারা সূচী পূরণের ফ্যাক্টরকে 20 এ সেট করেছে। এদিকে, আপনি ডিফল্ট মান 0 ধরে নিয়ে সূচী তৈরি করতে থাকবেন। দুর্ভাগ্যবশত, আপনার কাছে পূরণ করার কোন উপায় নেই। যতক্ষণ না আপনি একটি সূচক তৈরি করবেন না ততক্ষণ পর্যন্ত ফ্যাক্টর করুন এবং তারপরে মানটি পরীক্ষা করুন যেমন আমরা আমাদের উদাহরণগুলিতে করেছি। অন্যথায়, আপনাকে সেই মুহূর্তটির জন্য অপেক্ষা করতে হবে যখন ক্যোয়ারী কার্যক্ষমতা এতটা কমে যায় যে আপনি কিছু সন্দেহ করতে শুরু করেন।
আরেকটি সমস্যা যা আপনার সচেতন হওয়া উচিত তা হল সূচী পুনর্নির্মাণ। একটি সূচক তৈরি করার মতো, আপনি যখন এটি পুনর্নির্মাণ করবেন তখন আপনি সূচক পূরণ ফ্যাক্টর মান নির্দিষ্ট করতে পারেন। যাইহোক, create index কমান্ডের বিপরীতে, rebuild সার্ভারের ডিফল্ট সেটিংস ব্যবহার করে না, যদিও এটি মনে হতে পারে। এমনকি আরো, যদি আপনি নির্দিষ্টভাবে সূচক পূরণ ফ্যাক্টর মান উল্লেখ না করেন, তাহলে SQL সার্ভারসহগটির মান ব্যবহার করবে যার সাথে এই সূচকটি এর পুনর্গঠনের আগে বিদ্যমান ছিল। উদাহরণস্বরূপ, নিম্নলিখিত অপারেশন সূচক পরিবর্তন করুনআমরা এইমাত্র তৈরি করা সূচকটি পুনর্নির্মাণ করে:
সূচী পরিবর্তন করুন ix_people_lastname on Person.Person REBUILD; sys.indexes থেকে ফিল_ফ্যাক্টর নির্বাচন করুন যেখানে object_id = object_id("Person.Person") এবং name="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 সার্ভারফিল্টারযোগ্য সূচীগুলির উপর বিভিন্ন বিধিনিষেধ আরোপ করে, যেমন একটি ভিউতে একটি ফিল্টারযোগ্য সূচক তৈরি করতে অক্ষমতা, তাই ডকুমেন্টেশনটি সাবধানে পড়ুন।
এটি এমনও হতে পারে যে আপনি একটি সূচিবদ্ধ ভিউ তৈরি করে অনুরূপ ফলাফল অর্জন করতে পারেন। যাইহোক, একটি ফিল্টার করা সূচকের বেশ কিছু সুবিধা রয়েছে, যেমন রক্ষণাবেক্ষণের খরচ কমানোর ক্ষমতা এবং আপনার কার্যকরী পরিকল্পনার গুণমান উন্নত করা। ফিল্টার করা সূচীগুলিও অনলাইনে পুনর্নির্মাণ করা যেতে পারে। একটি ইনডেক্সড ভিউ দিয়ে এটি চেষ্টা করুন।

এবং আবার অনুবাদক থেকে একটু

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

প্রতিশ্রুতি অনুযায়ী, যারা আরও জানতে চান তাদের জন্য বই
আমি নিজের থেকে তিনটি খুব ভাল বই সুপারিশ করি (লিঙ্কগুলি নেতৃত্ব দেয় জ্বালানোদোকানে সংস্করণ আমাজন):

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

    ROWID সূচকহল ডাটাবেস অবজেক্ট যা একটি টেবিলের কলামের সমস্ত মানের প্রদর্শন প্রদান করে, সেইসাথে টেবিলের সমস্ত সারির ROWID যে কলামের মান রয়েছে।

    ROWIDএকটি ছদ্ম-কলাম যা একটি টেবিলের একটি সারির জন্য একটি অনন্য শনাক্তকারী এবং প্রকৃতপক্ষে সেই নির্দিষ্ট সারির সঠিক শারীরিক অবস্থান বর্ণনা করে। এই তথ্যের ভিত্তিতে ওরাকলপরবর্তীতে টেবিল সারির সাথে যুক্ত ডেটা খুঁজে পেতে পারে। প্রতিবার একটি সারি সরানো, রপ্তানি, আমদানি বা অন্য কোনো অপারেশন যা এর অবস্থান পরিবর্তন করে, ROWIDলাইন কারণ এটি একটি ভিন্ন শারীরিক অবস্থান দখল করে। ডেটা স্টোরেজের জন্য ROWID 80 বিট (10 বাইট) প্রয়োজন। শনাক্তকারী ROWIDচারটি উপাদান নিয়ে গঠিত: অবজেক্ট নম্বর (32 বিট), আপেক্ষিক ফাইল নম্বর (10 বিট), ব্লক নম্বর (22 বিট) এবং লাইন নম্বর (16 বিট)। এই শনাক্তকারীগুলি 18-অক্ষরের ক্রম হিসাবে প্রদর্শিত হয় যা ডাটাবেসের ডেটার অবস্থান নির্দেশ করে, প্রতিটি অক্ষর A-Z, a-z, 0-9, + এবং / অক্ষরগুলির সমন্বয়ে ভিত্তি-64 বিন্যাসে উপস্থাপিত হয়। প্রথম ছয়টি অক্ষর হল ডেটা অবজেক্ট নম্বর, পরের তিনটি হল আপেক্ষিক ফাইল নম্বর, পরের ছয়টি হল ব্লক নম্বর এবং শেষ তিনটি হল লাইন নম্বর।

    উদাহরণ:

    পরিবার নির্বাচন করুন, ROWIDছাত্র থেকে;

    FAM ROWID

    ——————————————

    Ivanov AAAA3kAAGAAAAGsAAA

    পেট্রোভ এএএএ3কএএএএএএএএএএএএবি

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

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

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