আমি আমার অফিসে বিভিন্ন বিকাশকারীদের সাথে একটি সূচকের ব্যয় এবং একটি স্বাতন্ত্র্য উপকারী বা ব্যয়বহুল (সম্ভবত উভয়ই) তা নিয়ে চলমান বিতর্ক করছি। ইস্যুটির ক্রুশ আমাদের প্রতিযোগিতামূলক সংস্থান।
পটভূমি
আমি পূর্বে একটি আলোচনা পড়েছি যা জানিয়েছে যে কোনও Unique
সূচক বজায় রাখতে কোনও অতিরিক্ত ব্যয় হয় না, যেহেতু কোনও Insert
ক্রিয়াকলাপটি বি-গাছের সাথে এটি খাপ খায় এমন জায়গাটি স্পষ্টভাবে পরীক্ষা করে এবং যদি কোনও অনন্য সূচকটিতে কোনও সদৃশ পাওয়া যায়, তবে একটি অনন্যকারীকে যুক্ত করে কীটি শেষ হলেও অন্যথায় সরাসরি সন্নিবেশ করানো হয়। ইভেন্টগুলির এই ক্রমে, কোনও Unique
সূচকের অতিরিক্ত ব্যয় হয় না।
আমার সহকর্মী এই বক্তব্যটির সাথে লড়াই করে বলেন যে Unique
বি-ট্রিতে নতুন অবস্থানের সন্ধানের পরে এটি দ্বিতীয় ক্রিয়াকলাপ হিসাবে প্রয়োগ করা হয়েছে এবং এটি অনন্য-অনন্য সূচকের চেয়ে বজায় রাখা আরও ব্যয়বহুল।
সবচেয়ে খারাপ সময়ে, আমি একটি পরিচয় কলাম (সহজাতভাবে অনন্য) সহ সারণীগুলি দেখেছি যা টেবিলের ক্লাস্টারিং কী, তবে স্পষ্টভাবে অ-অনন্য হিসাবে বর্ণনা করা হয়েছে। সবচেয়ে খারাপ দিকটি হ'ল আমার স্বাতন্ত্র্যতা সম্পর্কে আচ্ছন্নতা এবং সমস্ত সূচকগুলি অনন্য হিসাবে তৈরি করা হয় এবং যখন কোনও সূচির সাথে স্পষ্টভাবে অনন্য সম্পর্কের সংজ্ঞা দেওয়া সম্ভব হয় না, তখন সুনির্দিষ্ট হওয়ার জন্য আমি টেবিলের পিকেকে সূচকটির শেষে যুক্ত করে রাখি স্বতন্ত্রতা গ্যারান্টিযুক্ত।
আমি প্রায়শই দেব দলের কোড কোড রিভিউতে জড়িত থাকি এবং তাদের অনুসরণ করার জন্য আমার সাধারণ নির্দেশিকাগুলি দিতে সক্ষম হওয়া প্রয়োজন। হ্যাঁ, প্রতিটি সূচকের মূল্যায়ন করা উচিত, তবে যখন আপনি প্রতিটি টেবিলে কয়েক হাজার টেবিল সহ পাঁচটি সার্ভার এবং একটি টেবিলে বিশটির মতো সূচী রাখেন, তখন একটি নির্দিষ্ট স্তরের মানের নিশ্চিত করতে আপনার কয়েকটি সাধারণ নিয়ম প্রয়োগ করতে সক্ষম হতে হবে।
প্রশ্ন
স্বতন্ত্রতার কোনও Insert
অনন্য-অনন্য সূচক বজায় রাখার ব্যয়ের তুলনায় ব্যাক-এন্ডের অতিরিক্ত মূল্য রয়েছে ? দ্বিতীয়ত, স্বতন্ত্রতা নিশ্চিত করতে কোনও সূচকের শেষে টেবিলের প্রাথমিক কী সংযোজনে কোন সমস্যা?
উদাহরণ সারণী সংজ্ঞা
create table #test_index
(
id int not null identity(1, 1),
dt datetime not null default(current_timestamp),
val varchar(100) not null,
is_deleted bit not null default(0),
primary key nonclustered(id desc),
unique clustered(dt desc, id desc)
);
create index
[nonunique_nonclustered_example]
on #test_index
(is_deleted)
include
(val);
create unique index
[unique_nonclustered_example]
on #test_index
(is_deleted, dt desc, id desc)
include
(val);
উদাহরণ
আমি কেন Unique
সূচকের শেষে কীটি যুক্ত করব তার একটি উদাহরণ আমাদের ফ্যাক্ট সারণীতে রয়েছে। একটা হল Primary Key
একটি যে Identity
কলাম। তবে এর Clustered Index
পরিবর্তে পার্টিশন স্কিম কলামটি রয়েছে, তারপরে তিনটি বিদেশী কী মাত্রা রয়েছে যার কোনও স্বাতন্ত্র্য নেই। এই টেবিলটিতে নির্বাচন কর্মক্ষমতা অস্বাভাবিক, এবং আমি প্রায়শই Primary Key
কোনও চাবি অনুসন্ধানের সাথে আরও ভাল ব্যবহারের পরিবর্তে ব্যবহার করার চেয়ে আরও ভাল সময় পাওয়ার চেষ্টা করি Clustered Index
। অন্যান্য টেবিলগুলি একই ধরণের নকশা অনুসরণ Primary Key
করে তবে শেষ পর্যন্ত যুক্ত হয়েছে আরও ভাল পারফরম্যান্স।
-- date_int is equivalent to convert(int, convert(varchar, current_timestamp, 112))
if not exists(select * from sys.partition_functions where [name] = N'pf_date_int')
create partition function
pf_date_int (int)
as range right for values
(19000101, 20180101, 20180401, 20180701, 20181001, 20190101, 20190401, 20190701);
go
if not exists(select * from sys.partition_schemes where [name] = N'ps_date_int')
create partition scheme
ps_date_int
as partition
pf_date_int all
to
([PRIMARY]);
go
if not exists(select * from sys.objects where [object_id] = OBJECT_ID(N'dbo.bad_fact_table'))
create table dbo.bad_fact_table
(
id int not null, -- Identity implemented elsewhere, and CDC populates
date_int int not null,
dt date not null,
group_id int not null,
group_entity_id int not null, -- member of group
fk_id int not null,
-- tons of other columns
primary key nonclustered(id, date_int),
index [ci_bad_fact_table] clustered (date_int, group_id, group_entity_id, fk_id)
)
on ps_date_int(date_int);
go
if not exists(select * from sys.objects where [object_id] = OBJECT_ID(N'dbo.better_fact_table'))
create table dbo.better_fact_table
(
id int not null, -- Identity implemented elsewhere, and CDC populates
date_int int not null,
dt date not null,
group_id int not null,
group_entity_id int not null, -- member of group
-- tons of other columns
primary key nonclustered(id, date_int),
index [ci_better_fact_table] clustered(date_int, group_id, group_entity_id, id)
)
on ps_date_int(date_int);
go
Case
এবংIf
কাঠামোগুলি 10 টি স্তরের মধ্যে সীমাবদ্ধ, এটি বোধগম্য হয় যে অ-অনন্য অস্তিত্বগুলি সমাধান করারও সীমা রয়েছে। আপনার বক্তব্য অনুসারে, এই শব্দগুলি শোনাতে কেবল তখনই প্রযোজ্য যখন ক্লাস্টারিং কীটি অনন্য is এটি কিNonclustered Index
কোনওর জন্য সমস্যা বা ক্লাস্টারিং কীটি থাকলে সূচকগুলিরUnique
জন্য কোনও সমস্যা নেইNonclustered
?