আমি কি কেবল পিকে উদ্দেশ্যে ক্রস-রেফারেন্স টেবিলটিতে একটি স্বয়ং-বৃদ্ধি / পরিচয় ক্ষেত্র যুক্ত করব?


9

আমি আমার এসকিউএল সার্ভার-হোস্ট করা ডিবিতে নিম্নলিখিত ক্রস-রেফারেন্স সারণীটি যুক্ত করছি:

company_id bigint not null (FK)
org_path nvarchar (2048) not null

company_idক্ষেত্র নির্দেশ করে idঅন্য টেবিলে ক্ষেত্র (যেখানে এটি প্রাথমিক কী)।

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

হিসাবে org_path, এই শুধুমাত্র টেবিল যেখানে এটি বিদ্যমান। এই টেবিলের জন্য অনুসন্ধানগুলি সমস্ত প্রবেশিকা বা সমস্ত org_pathএন্ট্রি দ্বারা জিজ্ঞাসা করবে এমন সম্ভাবনা রয়েছে company_id। বা অন্যভাবে বলতে গেলে সন্দেহজনক মনে হয় যে এই টেবিলটি কখনই জিজ্ঞাসা করা হবে org_path। তদুপরি, এটি org_pathআপডেট হওয়ার সম্ভাবনা কম এবং সম্ভবত সম্ভবত sertedোকানো এবং সম্ভবত খুব কমই - মোছা হবে।

আমি প্রত্যাশা করি যে সারির মোট সংখ্যা কম হাজারে হবে।

এছাড়াও, এর কারণ nvarchar (2048)হ'ল মানটি তৃতীয় পক্ষের ডিবিতে নকল করতে হয়। একটি সাধারণ উদাহরণ কিছু হবে

\Translation Providers\[customer name]\[order name]\

এবং ডায়াক্রিটিক্স থাকতে পারে।

সুতরাং আমার প্রশ্নটি হ'ল: কী স্বয়ংক্রিয়-বৃদ্ধি idক্ষেত্র যুক্ত করা এবং সেইটিকে company_idপ্রাথমিক কী হিসাবে ব্যবহার করা বা এটি অপ্রয়োজনীয় ওভারহেড যুক্ত করা আরও কার্যকর হবে - এবং company_idঅন্য টেবিলে থাকা প্রাথমিক কীটি কোনও আছে তা কি সত্য? এখানে প্রভাব?

উত্তর:


7

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

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

এছাড়াও, যদি আপনি ডুপ্লিকেটগুলি দিয়ে শেষ করেন (company_id,org_path), সুস্পষ্ট পরিচয় কলাম (এক ধরণের "এক্সপোজড ইউনিক্লিফায়ার") থাকা মুছতে বা আপডেট করার জন্য তাদের মধ্যে কেবল একটিকে লক্ষ্য করা সহজ করে তুলবে।


12

একটি বিষয় বিবেচনা করতে হবে যে একটি প্রাথমিক কী এবং একটি ক্লাস্টার্ড সূচক একই জিনিস নয়। একটি প্রাথমিক কী একটি সীমাবদ্ধতা এবং সেই নিয়মগুলির সাথে ডিল করে যার মাধ্যমে ডেটা বেঁচে থাকে (অর্থাত্ ডেটা অখণ্ডতা); দক্ষতার / পারফরম্যান্সের সাথে এর কোনও যোগসূত্র নেই। প্রাথমিক কীটির জন্য কী কলাম (গুলি) অনন্য (সংমিশ্রণে) হওয়া উচিত নয় এবং নাল (পৃথকভাবে) নয় 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োকানো হয়নি, আমি FILLFACTOR90 এর মধ্যে একটি নির্দিষ্ট করে দেব the খণ্ডকে হ্রাস করতে আপনার নিয়মিত সূচি রক্ষণাবেক্ষণও করতে হবে তা নিশ্চিত করতে হবে।

দ্বিতীয় প্রশ্ন

অন্য টেবিলে প্রাথমিক কী হ'ল কোম্পানী_আইডি এখানে কোনও প্রভাব ফেলে

না।

ট্রিগার

যেহেতু একটিতে org_pathমানগুলি company_idঅনন্য, আপনার এটি INSERT, UPDATEপ্রয়োগের জন্য এখনও একটি ট্রিগার তৈরি করা উচিত । ট্রিগারটিতে, এমন IF EXISTSকোয়েরি দিয়ে একটি করুন যা সম্ভবত একটি COUNT(*)এবং করে GROUP BY company_id, org_path। যদি কিছু পাওয়া যায় ROLLBACKতবে ডিএমএল ক্রিয়াকলাপ বাতিল করতে একটি জারি করুন এবং তারপরে RAISERRORনকল রয়েছে এমন একটি কথা বলুন।

হালকা খাবার

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



0

আপনার পিকে দরকার কেন?

কেন কেবল একটি ক্লাস্টারযুক্ত সূচক হিসাবে কোম্পানী_আইডের সাথে যাবেন না?

আপনি বলেছিলেন যে সর্বাধিক সন্ধান করা সমস্ত এন্ট্রিতে বা কোম্পানী_আইডি দ্বারা
খুব কমই আপডেট করা হয় org_path কে খুব
কমই মুছুন
, এটি কেবলমাত্র টেবিল যেখানে এটি বিদ্যমান

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

আপনি যদি ডিআরআই সম্পর্কে উদ্বিগ্ন হন তবে টেবিলগুলিতে কোম্পানির সারণীটি কোম্পানী_ আইডির জন্য এফকে হিসাবে ব্যবহার করা উচিত


আরে। সংক্রান্ত " কেন নয় এইমাত্র কোনো অ- ক্লাস্টার সূচক যেমন company_id সঙ্গে যেতে? ": কারণ যে 2 নিচে- পক্ষের হবে: 1) এটি 1 আরও একটি জিনিস স্থান গ্রহণ হবে যেহেতু ক্লাস্টার ইনডেক্স হয় টেবিল কোন অতিরিক্ত আইটেম তাই হয়, এবং ২) এনভিচারারআর ফিল্ডটি পেতে যদি এখনও একটি আরআইডি লুকের প্রয়োজন হয়, যদি না এটি একটি INCLUDEকলাম না হত তবে এটি আরও খারাপ যে এটি কেবল টেবিলটিকে নকল করে দিচ্ছে। সত্য, পিকে প্রয়োজনীয় নয়; গুরুত্বপূর্ণ অংশটি ক্লাস্টারড ইনডেক্স। তবে একবার আপনার পরিচয় পেলে পিকে-র সাথেও যেতে পারে। এবং দয়া করে অ্যান্টিফায়ার-এ ওয়াক-থ্রোয়ের জন্য আমার উত্তরের নতুন লিঙ্কটি দেখুন
সলোমন রুটজকি

@ শ্রুতজকি তবে এটি একটি 4 বাইট পূর্ণসংখ্যার ইউনিকফায়ার এড়িয়ে চলেছে তাই আমি দেখতে পাচ্ছি যে ওয়াশ হিসাবে
পাপারাজ্জো

10 কে কম সারি সহ, এটি কোনও ব্যাপার নয়; মাত্র 4 বাইটের প্রভাব লক্ষ্য করার আগে আপনাকে লক্ষ লক্ষ সারিতে থাকতে হবে। সুতরাং "সমস্ত সারিগুলি পান" ক্যোয়ারির জন্য এই বিকল্পগুলির কোনওর মধ্যে সত্যিই কোনও পার্থক্য নেই। তবে "get_ company_id = @param" ক্যোয়ারির জন্য, company_id দ্বারা শারীরিকভাবে অর্ডার করা ডেটা থাকা সহায়তা করবে, বিশেষত যখন প্রতিটি সারির জন্য একটি আরআইডি লুকআপ করার প্রয়োজন হয় না।
সলোমন রুটজকি

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