একটি বিষয় বিবেচনা করতে হবে যে একটি প্রাথমিক কী এবং একটি ক্লাস্টার্ড সূচক একই জিনিস নয়। একটি প্রাথমিক কী একটি সীমাবদ্ধতা এবং সেই নিয়মগুলির সাথে ডিল করে যার মাধ্যমে ডেটা বেঁচে থাকে (অর্থাত্ ডেটা অখণ্ডতা); দক্ষতার / পারফরম্যান্সের সাথে এর কোনও যোগসূত্র নেই। প্রাথমিক কীটির জন্য কী কলাম (গুলি) অনন্য (সংমিশ্রণে) হওয়া উচিত নয় এবং নাল (পৃথকভাবে) নয় be একটি পিকে একটি অনন্য সূচকের মাধ্যমে প্রয়োগ করা হয়, যদিও এটি ক্লাস্টারযুক্ত বা নন-ক্লাস্টারযুক্ত হতে পারে।
একটি ক্লাস্টারড ইনডেক্স শারীরিকভাবে (অর্থাত্ ডিস্কে) একটি উপায় যা টেবিলে ডেটা অর্ডার করে এবং কার্য সম্পাদন করে; ডেটা অখণ্ডতার সাথে এর কোনও যোগসূত্র নেই। একটি ক্লাস্টার্ড সূচক পারেমূল কলাম (গুলি) অনন্য (সংমিশ্রণে) হওয়া দরকার, তবে এটির দরকার নেই। তবে, যেহেতু ক্লাস্টারড ইনডেক্সটি হ'ল ডেটার দৈহিক ক্রম, তাই প্রতিটি সারি স্বতন্ত্রভাবে সনাক্ত করা দরকার যাই হোক না কেন। সুতরাং আপনি যদি এটি স্বতন্ত্রতার প্রয়োজন হিসাবে সেট না করেন তবে এটি একটি লুকানো 4-বাইট "স্বতন্ত্র" কলামের মাধ্যমে নিজস্ব স্বাতন্ত্র্য তৈরি করবে। সেই কলামটি সর্বদা অ-স্বতন্ত্র ক্লাস্টারড ইনডেক্সগুলিতে থাকে তবে মূল ক্ষেত্রগুলি অনন্য (সংমিশ্রণে) হয়ে গেলে এটি কোনও স্থান নেয় না। এই "ইউনিফাইফায়ার" কলামটি কীভাবে কাজ করে তা প্রথম দেখার জন্য (ক্লাস্টারড ইনডেক্সে এবং নন-ক্লাস্টারড ইনডেক্সগুলিতে উভয়ই প্রভাব রয়েছে), অনুগ্রহ করে আকারটি পরীক্ষা করতে আমি পেস্টবিন: টি-এসকিউএল স্ক্রিপ্টটিতে পোস্ট করা এই পরীক্ষামূলক স্ক্রিপ্টটি পরীক্ষা করে দেখুন ।
সুতরাং, এর মূল প্রশ্ন:
একটি অটো-ইনক্রিমেন্ট id
ফিল্ড যুক্ত company_id
করা এবং প্রাথমিক কী হিসাবে এটি ব্যবহার করার জন্য এটি আরও দক্ষ হবে, বা এটি অপ্রয়োজনীয় ওভারহেড যুক্ত করবে
এই দুটি ধারণাকে বিভ্রান্ত করছে, তাই অবশ্যই আলাদাভাবে সম্বোধন করা দরকার, যদিও কিছুটা ওভারল্যাপ অবশ্যই রয়েছে।
একটি IDENTITY
কলাম যুক্ত করা উচিত বা এটি অপ্রয়োজনীয় ওভারহেড হবে?
যদি আপনি একটি INT IDENTITY
কলাম যুক্ত করেন এবং এটি কোনও পিকে তৈরি করতে ব্যবহার করেন তবে ধরে নিবেন এটি একটি ক্লাস্টারড পিকে হবে, যা প্রতিটি সারিতে 4 বাইট যুক্ত করে। এই কলামটি প্রশ্নের মধ্যে দৃশ্যমান এবং ব্যবহারযোগ্য। এটি অন্য টেবিলগুলিতে একটি বিদেশী কী হিসাবে যুক্ত করা যেতে পারে, যদিও এই বিশেষ ক্ষেত্রে এটি হবে না।
আপনি যদি INT IDENTITY
কলামটি না যোগ করেন তবে আপনি এই টেবিলটিতে কোনও পিকে তৈরি করতে পারবেন না। তবে আপনি যতক্ষণ না UNIQUE
বিকল্পটি ব্যবহার না করেন ততক্ষণ আপনি টেবিলে একটি ক্লাস্টারড ইনডেক্স তৈরি করতে পারেন । এই ক্ষেত্রে, এসকিউএল সার্ভার উপরে বর্ণিত হিসাবে আচরণ করে "ইউনিকিফায়ার" নামে একটি গোপন কলাম যুক্ত করবে। কলামটি লুকানো আছে বলে এটি কোয়েরিতে বা বিদেশী কীগুলির জন্য একটি রেফারেন্স হিসাবে ব্যবহার করা যায় না।
দক্ষতা হিসাবে যতদূর যায়, এই বিকল্পগুলি প্রায় একই। হ্যাঁ, কিছু সারি (প্রাথমিক অনন্য কী মানগুলির সাথে) 0 বাইট গ্রহণের কারণে অ-স্বতন্ত্র ক্লাস্টারড সূচক নিয়ে কিছুটা কম স্থান নেওয়া হবে যখন IDENTITY
/ পিকে সমস্ত সারি 4 বাইট লাগবে। তবে 0 বাইট সারিগুলির পর্যাপ্ত পরিমাণে থাকবে না (বিশেষত কম পরিমাণে সারি প্রত্যাশিত প্রত্যাশার সাথে) কোনও পার্থক্য লক্ষ্য করার জন্য, ID
প্রশ্নগুলিতে কলামটি ব্যবহার করতে সক্ষম হওয়ার সুবিধার্থে একা থাকুক ।
INT পরিচয় কলাম বা পার্সিত গণিত কলামের হ্যাশ org_path
?
প্রদত্ত যে আপনি org_path
মানগুলির উপর ভিত্তি করে সারিগুলি সন্ধান করবেন না , তারপরে পার্সিস্টড কম্পিউটেড কলামের ওভারহেড যুক্ত করা উচিত এবং গণিত কলামের সাথে ম্যাচ করার জন্য প্রশ্নগুলিতে সেই হ্যাশ গণনা করা দরকার নয় (এটি আমার ছিল মূল প্রস্তাবনা, এখানে পুনর্বিবেচনার ইতিহাসে উপলভ্য , যা প্রাথমিক শব্দবাণী / প্রশ্নের বিবরণের ভিত্তিতে ছিল)। এই বিশেষ ক্ষেত্রে, INT IDENTITY
"আইডি" কলামটি সম্ভবত সেরা।
কী কলামের আদেশ
প্রদত্ত যে ID
কলামটি খুব কমই, যদি কখনও সন্ধানগুলিতে ব্যবহৃত হয় এবং দুটি প্রধান ব্যবহারের ক্ষেত্রে "সমস্ত সারি" বা "প্রদত্তের জন্য সমস্ত সারি company_id
" পাওয়া যায় তবে আমি পিকে তৈরি করব company_id, id
। এবং এর অর্থ এই যে সারিগুলি ক্রমানুসারে sertedোকানো হয়নি, আমি FILLFACTOR
90 এর মধ্যে একটি নির্দিষ্ট করে দেব the খণ্ডকে হ্রাস করতে আপনার নিয়মিত সূচি রক্ষণাবেক্ষণও করতে হবে তা নিশ্চিত করতে হবে।
দ্বিতীয় প্রশ্ন
অন্য টেবিলে প্রাথমিক কী হ'ল কোম্পানী_আইডি এখানে কোনও প্রভাব ফেলে
না।
ট্রিগার
যেহেতু একটিতে org_path
মানগুলি company_id
অনন্য, আপনার এটি INSERT, UPDATE
প্রয়োগের জন্য এখনও একটি ট্রিগার তৈরি করা উচিত । ট্রিগারটিতে, এমন IF EXISTS
কোয়েরি দিয়ে একটি করুন যা সম্ভবত একটি COUNT(*)
এবং করে GROUP BY company_id, org_path
। যদি কিছু পাওয়া যায় ROLLBACK
তবে ডিএমএল ক্রিয়াকলাপ বাতিল করতে একটি জারি করুন এবং তারপরে RAISERROR
নকল রয়েছে এমন একটি কথা বলুন।
হালকা খাবার
আমার প্রাথমিক উত্তরে (প্রশ্নের মূল শব্দের সংক্ষিপ্ত বিবরণের উপর ভিত্তি করে / এবং এখানে পুনর্বিবেচনার ইতিহাসে উপলব্ধ ), আমি সম্ভবত বাইনারি (অর্থাত্ _BIN2
) কোলেশন ব্যবহার করার পরামর্শ দিয়েছিলাম । এখন যেহেতু আমাদের ঠিক org_path
কী তা অন্তর্দৃষ্টি রয়েছে, আমি বাইনারি কোলেশন ব্যবহার করার পরামর্শ দেব না । যেহেতু ডায়েরাট্রিকাল চিহ্ন থাকবে, তাই আপনি ভাষাগত সমতা ব্যবহার করতে চান না ।