জিআইডিগুলি আপনার প্রাথমিক কীটির জন্য প্রাকৃতিক পছন্দ বলে মনে হতে পারে - এবং আপনার যদি সত্যিই আবশ্যক হয় তবে আপনি সম্ভবত এটি টেবিলের প্রাথমিক কী জন্য ব্যবহার করতে তর্ক করতে পারেন। আমি দৃ strongly়ভাবে যা না করার পরামর্শ দিচ্ছি তা হল জিআইডি কলামটি ক্লাস্টারিং কী হিসাবে ব্যবহার করা , যা এসকিউএল সার্ভার ডিফল্টরূপে করে, যদি না আপনি এটি নির্দিষ্টভাবে না বলে থাকেন tell
আপনার দুটি বিষয় আলাদা করে রাখা দরকার:
প্রাথমিক কী একটি লজিক্যাল কনস্ট্রাক্ট হয় - প্রার্থী কী স্বতন্ত্রভাবে যে এবং নির্ভরযোগ্যভাবে আপনার টেবিল প্রতিটি সারি চিহ্নিত করুন। এটি সত্যিই - এ INT
, ক GUID
, একটি স্ট্রিং - যা কিছু হতে পারে আপনার চয়ন করুন যা আপনার দৃশ্যের জন্য সর্বাধিক অর্থপূর্ণ।
ক্লাস্টারিং কী (কলাম বা কলাম যে টেবিলের উপর "ক্লাস্টার সূচক" define) - এই একটি হল শারীরিক স্টোরেজ-সম্পর্কিত জিনিস এখানে, এবং, একটি ছোট, স্থিতিশীল, সদা বৃদ্ধি ডাটা টাইপ আপনার সেরা পছন্দ হয় - INT
বা BIGINT
হিসাবে আপনার ডিফল্ট বিকল্প।
ডিফল্টরূপে, এসকিউএল সার্ভার টেবিলের প্রাথমিক কীটিও ক্লাস্টারিং কী হিসাবে ব্যবহৃত হয় - তবে সেভাবে হওয়ার দরকার নেই! পূর্ববর্তী জিইউইড-ভিত্তিক প্রাথমিক / ক্লাস্টার কী দুটি পৃথক কী - জিইউডির প্রাথমিক (লজিকাল) কী এবং পৃথক INT IDENTITY(1,1)
কলামে ক্লাস্টারিং (ক্রম) কীটি ভাঙ্গার সময় আমি ব্যক্তিগতভাবে ব্যাপক পারফরম্যান্স লাভ দেখেছি ।
হিসাবে Kimberly Tripp ইন্ডেক্সিং রানী - - এবং অন্যদের জন্য একটি দুর্দান্ত অনেকবার বলেছেন - একটি GUID
হিসাবে ক্লাস্টারিং কী, অনুকূল নয় তার যদৃচ্ছতা কারণে যেহেতু, এটা বৃহদায়তন পৃষ্ঠা এবং সূচক ফ্র্যাগমেন্টেশন প্রয়োজন এবং সাধারণভাবে খারাপ পারফরম্যান্স হতে হবে।
হ্যাঁ, আমি জানি - newsequentialid()
এসকিউএল সার্ভার ২০০৫ এবং তার মধ্যে রয়েছে - তবে এটি সত্যিকার অর্থে এবং পুরোপুরি অনুক্রমিক নয় এবং এইভাবে একই সমস্যার সাথে ভুগছে GUID
- কিছুটা কম স্পষ্টতই তাই।
তারপরে আরও একটি বিষয় বিবেচনা করার আছে: একটি টেবিলের ক্লাস্টারিং কীটি আপনার টেবিলে প্রতিটি নন-ক্লাস্টারড ইনডেক্সের প্রতিটি এন্ট্রিতে যুক্ত হবে - সুতরাং আপনি সত্যই এটি নিশ্চিত করতে চান যে এটি যতটা সম্ভব ছোট। সাধারণত, INT
2+ বিলিয়ন সারি সহ একটি বৃহত্তর সারণীর পক্ষে পর্যাপ্ত পরিমাণে হওয়া উচিত - এবং GUID
ক্লাস্টারিং কী হিসাবে তুলনা করে আপনি নিজেকে ডিস্কে এবং সার্ভার মেমোরিতে কয়েকশ মেগাবাইট স্টোরেজ সংরক্ষণ করতে পারেন।
দ্রুত গণনা - INT
বনাম বনাম GUID
প্রাথমিক এবং ক্লাস্টারিং কী হিসাবে ব্যবহার করে :
- 1'000'000 সারি সহ বেস সারণী (3.8 এমবি বনাম 15.26 এমবি)
- 6 নন ক্ল্লাস্টার্ড ইনডেক্স (22.89 এমবি বনাম 91.55 এমবি)
মোট: 25 এমবি বনাম 106 এমবি - এবং এটি কেবল একটি একক টেবিলে!
চিন্তার জন্য আরও কিছু খাবার - কিম্বারলি ট্রিপ দ্বারা দুর্দান্ত স্টাফ - এটি পড়ুন, আবার এটি পড়ুন, হজম করুন! এটি সত্যিই এসকিউএল সার্ভার সূচীকরণ গসপেল।
পিএস: অবশ্যই, আপনি যদি কয়েকশ বা কয়েক হাজার সারি নিয়ে কাজ করে থাকেন - তবে এই যুক্তিগুলির বেশিরভাগেরই সত্যই আপনার প্রভাব ফেলবে না। তবে: আপনি যদি দশকে বা কয়েক হাজারে সারিতে প্রবেশ করেন বা আপনি লক্ষ লক্ষ গণনা শুরু করেন - তবে এই পয়েন্টগুলি খুব গুরুত্বপূর্ণ এবং বুঝতে খুব গুরুত্বপূর্ণ হয়ে ওঠে।
আপডেট: আপনি যদি নিজের PKGUID
কলামটি আপনার প্রাথমিক কী হিসাবে (তবে আপনার ক্লাস্টারিং কী নয়) এবং অন্য একটি কলাম MYINT
( INT IDENTITY
) আপনার ক্লাস্টারিং কী হিসাবে রাখতে চান - এটি ব্যবহার করুন:
CREATE TABLE dbo.MyTable
(PKGUID UNIQUEIDENTIFIER NOT NULL,
MyINT INT IDENTITY(1,1) NOT NULL,
.... add more columns as needed ...... )
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY NONCLUSTERED (PKGUID)
CREATE UNIQUE CLUSTERED INDEX CIX_MyTable ON dbo.MyTable(MyINT)
মূলত: আপনাকে কেবল বাধাটি পরিষ্কারভাবে বলতে PRIMARY KEY
হবে যে এটি NONCLUSTERED
(অন্যথায় এটি আপনার ক্লাস্টার ইনডেক্স হিসাবে তৈরি হয়েছে, ডিফল্টরূপে) - এবং তারপরে আপনি একটি দ্বিতীয় সূচক তৈরি করেন যা সংজ্ঞায়িত হয়েছেCLUSTERED
এটি কাজ করবে - এবং এটির একটি বৈধ বিকল্প যদি আপনার কাছে বিদ্যমান সিস্টেম থাকে যা পারফরম্যান্সের জন্য "পুনরায় ইঞ্জিনিয়ারড" হওয়া দরকার। একটি নতুন সিস্টেমের জন্য, আপনি যদি স্ক্র্যাচ থেকে শুরু করেন এবং আপনি কোনও প্রতিরূপের দৃশ্যে নেই, তবে আমি সর্বদা ID INT IDENTITY(1,1)
আমার ক্লাস্টার্ড প্রাথমিক কী হিসাবে বেছে নেব - অন্য যে কোনও কিছুর চেয়ে অনেক বেশি দক্ষ!