আমি কখন একটি অনন্য সূচির পরিবর্তে একটি অনন্য বাধা ব্যবহার করব?


194

যখন আমি একটি কলামের পৃথক মান থাকতে চাই, আমি হয় বাধা ব্যবহার করতে পারি

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go

বা আমি একটি অনন্য সূচক ব্যবহার করতে পারেন

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);

অনন্য প্রতিবন্ধকতা সহ কলামগুলি অনন্য সূচকগুলির জন্য ভাল প্রার্থী বলে মনে হচ্ছে।

অনন্য প্রতিবন্ধকতাগুলি ব্যবহার করার পরিবর্তে এবং অনন্য সূচকগুলি ব্যবহার না করার কোনও জ্ঞাত কারণ রয়েছে?


9
এগুলি কি আসলেই আলাদা? আমি মনে করি কিছু ডাটাবেসগুলিতে যেমন postgresql, একটি অনন্য বাধা কেবল একটি অনন্য সূচক তৈরি করে। আমি উত্তর দিচ্ছি না কারণ আমি স্কেল সার্ভার সম্পর্কে কিছুই জানি না।
xenoterracide

6
Postgresql এ, আপনি কোনও অনন্য সূচিতে একটি এক্সপ্রেশন ব্যবহার করতে পারেন তবে কোনও অনন্য সীমাবদ্ধতায় নয়।
নীল ম্যাকগুইগান

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

উত্তর:


153

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

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

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

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

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


1
আমি ভাবছি "ডাটাবেস যথেষ্ট উজ্জ্বল হবে না"? এটি কি সব আরডিবিএমএসের জন্য সত্য? এটি কি এসকিউএল-স্ট্যান্ডার্ড দ্বারা বাধ্যতামূলক? এমনকি যদি এটি হয় (এবং আমি ভাবছি কেন এটি হওয়া উচিত), সমস্ত বাস্তবায়ন কি সেভাবে বাস্তবায়ন করে? বা: কেন কোনও ডিবি পর্যাপ্ত পরিমাণে "উজ্জ্বল" হতে পারে না?
জারজেন এ। এরার্ড

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

3
+1 @ ডেভিড স্পিলিট আমি মনে করি যে মূলত ডিবিএমএস আপনাকে ধরে নিচ্ছে যে আপনি কী করছেন; যদি আপনি একই সূচকটি দু'বার তৈরির মতো মনে করেন তবে এটি আপনাকে প্রশ্ন করবে না।
অ্যান্ড্রু বারবার

2
খুব অন্তর্দৃষ্টিপূর্ণ এই আচরণটি মাইএসকিউএল এবং অ্যাপাচি ডার্বিতেও রয়েছে কিনা তা আপনি জানতে পেরেছেন?
কর্সিকা

5
আপনি একটি সীমাবদ্ধতার নাম দিতে পারেন এবং এটি একটি সূচক ইঙ্গিতে ব্যবহার করতে পারেন। CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1। সূচকগুলি আরও নমনীয় হতে পারে যদিও এই সীমাবদ্ধতায় সমস্ত কয়টি সূচক বিকল্প যেমন INCLUDEডি কলাম বা ফিল্টার করা সূচিগুলি সমর্থন করে না ।
মার্টিন স্মিথ

101

অন্যান্য উত্তরের পয়েন্টগুলি ছাড়াও, এখানে উভয়ের মধ্যে কয়েকটি মূল পার্থক্য রয়েছে।

দ্রষ্টব্য: ত্রুটি বার্তাগুলি এসকিউএল সার্ভার ২০১২ এর।

ত্রুটি

একটি অনন্য বাধা লঙ্ঘন ত্রুটি 2627 প্রদান করে।

Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.

একটি অনন্য সূচক লঙ্ঘন ত্রুটি 2601 প্রদান করে।

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.

অক্ষম করা হচ্ছে

একটি অনন্য বাধা অক্ষম করা যায় না।

Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.

তবে কোনও প্রাথমিক কী বাধার পিছনে অনন্য সূচক বা কোনও অনন্য প্রতিবন্ধকে অক্ষম করা যেতে পারে, যে কোনও অনন্য সূচকও। টুপি টিপ Brain2000।

ALTER INDEX P1_u ON dbo.P1 DISABLE ;

ক্লাস্টারড ইনডেক্স অক্ষম করা ডেটাটিকে অ্যাক্সেসযোগ্য করে তোলে এমন সাধারণ সতর্কতাটি নোট করুন।

বিকল্প

অনন্য প্রতিবন্ধকতাগুলি সূচক পছন্দগুলি পছন্দ করে FILLFACTORএবং পছন্দ করে IGNORE_DUP_KEY, যদিও এসকিউএল সার্ভারের প্রতিটি সংস্করণে এটি ঘটেনি case

অন্তর্ভুক্ত কলাম

ননক্র্লাস্টারড ইনডেক্সে অ-সূচকযুক্ত কলামগুলি অন্তর্ভুক্ত করতে পারে (আচ্ছাদন সূচক হিসাবে চিহ্নিত করা হয়, এটি একটি প্রধান কার্যকারিতা বৃদ্ধি)। প্রাথমিক কী এবং অনন্য সীমাবদ্ধতার পিছনে সূচকগুলি কলামগুলি অন্তর্ভুক্ত করতে পারে না। টুপি টিপ @ টিপিক्यूब।

ফিল্টারিং

একটি অনন্য বাধা ফিল্টার করা যায় না।

একটি অনন্য সূচক ফিল্টার করা যেতে পারে।

CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u 
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;

বিদেশী কী বাধা

একটি বিদেশী কী বাধা ফিল্টার করা অনন্য সূচককে উল্লেখ করতে পারে না, যদিও এটি একটি ফিল্টারবিহীন অনন্য সূচকটি উল্লেখ করতে পারে (আমার ধারণা এটি এসকিউএল সার্ভার 2005-এ যুক্ত হয়েছিল))

নামকরণ

সীমাবদ্ধতা তৈরি করার সময়, সীমাবদ্ধতার নাম উল্লেখ করা alচ্ছিক (সমস্ত পাঁচ ধরণের প্রতিবন্ধকতার জন্য)। আপনি যদি কোনও নাম নির্দিষ্ট না করেন তবে এমএসএসকিউএল আপনার জন্য একটি উত্পন্ন করবে।

CREATE TABLE dbo.T1 (
    TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
    TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;

সূচী তৈরি করার সময়, আপনাকে অবশ্যই একটি নাম নির্দিষ্ট করতে হবে।

আই-ওয়ান @ টুপি

লিংক

http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx

http://technet.microsoft.com/en-us/library/ms177456.aspx


একটি অনন্য প্রতিবন্ধকাকে একই সূচক হিসাবে একই পদ্ধতির মাধ্যমে অক্ষম করা এবং সক্ষম করা যেতে পারে: Uconstraint অক্ষম থাকলে INDEX tbl পরিবর্তন করুন, Uconstraint পুনরায় বিলম্ব করা INDEX টিবিএল এর পরিবর্তে
Brain2000

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

10

একটি অনুমোদিত উত্স হিসাবে এমএসডিএন উদ্ধৃতি:

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

এবং...

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

অন্যগুলিতে: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx


6

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


8
-1 এসকিউএল সার্ভারে নিম্নলিখিতটি ভুল: "অন্য টেবিলের একটি বিদেশী কী সীমাবদ্ধতা কলামগুলিকে উল্লেখ করতে পারে যা একটি অনন্য বাধা তৈরি করে unique এটি অনন্য সূচীর ক্ষেত্রে সত্য নয়"। এসকিউএল সার্ভারে, আমরা এফকে সীমাবদ্ধতাগুলি অনন্য সূচকগুলিতে উল্লেখ করতে পারি।
একে 20

4
আমার ধারণা, এসকিউএল সার্ভার ২০০৫-এ একটি অনন্য সূচকের রেফারেন্স দেওয়ার জন্য বিদেশী কী বাধা রক্ষার দক্ষতা ছিল B downvotes প্রাপ্য। তার বাকী উত্তর স্পট অন - সীমাবদ্ধতাগুলি এএনএসআই-স্ট্যান্ডার্ড, সূচিগুলি নেই।
গ্রিনস্টোন ওয়াকার

এগুলি সত্ত্বেও আমার প্রিয় উত্তরটি কমিয়ে দেয়।
चमत्कार 173

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

1

ওরাকলে একটি বড় পার্থক্য হ'ল আপনি একটি ফাংশন-অনন্য সূচক তৈরি করতে পারেন, যা অনন্য সীমাবদ্ধতায় কার্যকর নয়:

উদাহরণ স্বরূপ

create unique index ux_test on my_table (case when amount != 0 then fk_xyz end);

সুতরাং fk_xyzযা রেকর্ড জন্য শুধুমাত্র অনন্য amount != 0


7
এসকিউএল সার্ভারে (প্রশ্নের ট্যাগ) ইনডেক্সগুলি একটি WHEREধারা দিয়ে ফিল্টার করা যায় । CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
গ্রিনস্টোন ওয়াকার 21

-3

ইউনিক ইনডেক্সের চেয়ে অনন্য বাধাটিকেই প্রাধান্য দেওয়া হয়। সীমাবদ্ধতা অনন্য না হলে আপনার নিয়মিত বা অ-অনন্য সূচক ব্যবহার করা দরকার। প্রতিবন্ধকতাও অন্য ধরণের সূচক। সূচকগুলি দ্রুত অ্যাক্সেসের জন্য ব্যবহৃত হয়।

স্বতন্ত্র সূচকগুলিতে যেখানে ধারা থাকতে পারে। উদাহরণস্বরূপ, আপনি তারিখ কলামের উপর ভিত্তি করে প্রতি বছর সূচী তৈরি করতে পারেন

WHERE Sale_Date BETWEEN '2012-01-01' AND '2012-12-31'

যেখানে ক্লজ বেনিফিট উল্লিখিত হয়েছে তা দেখতে ভাল।
ক্রোকুসেক

3
"প্রতিবন্ধকতাও অন্য ধরণের সূচক" " না, তা নয়। কিছু বাধা (পিকে, ইউকিউ, এফকে) হতে পারে এবং প্রায়শই সূচকের ব্যবহার দ্বারা প্রয়োগ করা হয়। অগত্যা এবং সমস্ত ডিবিএমএসে ডিফল্টরূপে নয়।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.