আমি N NOCHECK` ব্যবহার করে একটি বিদেশী কী তৈরি করলে কী হারিয়ে যায়?


11

আমি জানি যে আমি যদি EXISTS()কোনও এফকে দেখার মানটিতে কল করি , তবে, যদি এফকে সীমাবদ্ধতা বিশ্বাসযোগ্য হয় তবে ফলাফলটি তাত্ক্ষণিক।

এবং যদি এটি বিশ্বাসযোগ্য না হয় (যেমন আমি যখন এফকে ব্যবহার করে তৈরি করি WITH NOCHECKতখন) তারপরে এসকিউএল সার্ভারে গিয়ে মূল্যটি সেখানে আছে কিনা তা দেখতে টেবিলে গিয়ে পরীক্ষা করতে হবে।

আমি ব্যবহার করে হারিয়েছি এমন আরও কিছু আছে কি NOCHECK?

উত্তর:


13

যেমন আপনি আপনার existsউদাহরণটি আবিষ্কার করেছেন , এসকিউএল সার্ভারটি এই প্রশ্নটি ব্যবহার করতে পারে যে ক্যোয়ারী প্ল্যানটি তৈরি হওয়ার পরে কোনও বিদেশী কী বিশ্বাসযোগ্য।

NOCHECK ব্যবহার করে আমি হারানোর মতো আরও কিছু আছে কি?

স্টি বোভের উত্তর অনুসারে এমন কোনও কলামে মানগুলি যুক্ত করতে পারবেন না যে স্টের বোভের উত্তর হিসাবে থাকা উচিত নয় যেখানে আপনার আরও দৃশ্যাবলী থাকবে যেখানে বিদেশী কী বিশ্বাসযোগ্য হলে ক্যোয়ারী পরিকল্পনাটি আরও ভাল হবে।

এখানে একটি সঙ্গে একটি উদাহরণ সূচীবদ্ধ দৃশ্য

আপনার কাছে বিশ্বস্ত এফকে সীমাবদ্ধতার সাথে দুটি সারণী রয়েছে।

create table dbo.Country
(
  CountryID int primary key,
  Name varchar(50) not null
);

create table dbo.City
(
  CityID int identity primary key,
  Name varchar(50),
  IsBig bit not null,
  CountryID int not null
);

alter table dbo.City 
  add constraint FK_CountryID 
  foreign key (CountryID) 
  references dbo.Country(CountryID);

এতগুলি দেশ নেই তবে গাজিলিয়ন শহর এবং এর কয়েকটি বড় শহর।

নমুনা তথ্য:

-- Three countries
insert into dbo.Country(CountryID, Name) values
(1, 'Sweden'),
(2, 'Norway'),
(3, 'Denmark');

-- Five big cities
insert into dbo.City(Name, IsBig, CountryID) values
('Stockholm', 1, 1),
('Gothenburg', 1, 1),
('Malmoe', 1, 1),
('Oslo', 1, 2),
('Copenhagen', 1, 3);

-- 300 small cities
insert into dbo.City(Name, IsBig, CountryID)
select 'NoName', 0, Country.CountryID
from dbo.Country
  cross apply (
              select top(100) *
              from sys.columns
              ) as T;

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

create view dbo.BigCityCount with schemabinding
as
select count_big(*) as BigCityCount,
       City.CountryID,
       Country.Name as CountryName
from dbo.City
  inner join dbo.Country
    on City.CountryID = Country.CountryID
where City.IsBig = 1 
group by City.CountryID,
         Country.Name;

 go

create unique clustered index CX_BigCityCount
  on dbo.BigCityCount(CountryID);

কিছুক্ষণ পরে একটি নতুন দেশ যুক্ত করার দাবি আসে

insert into dbo.Country(CountryID, Name) values(4, 'Finland');

এই সন্নিবেশটির জন্য ক্যোয়ারী পরিকল্পনায় কোনও বিস্ময় নেই।

এখানে চিত্র বর্ণনা লিখুন

Countryটেবিলটিতে একটি ক্লাস্টার্ড সূচক .োকানো ।

এখন, যদি আপনার বিদেশী কী বিশ্বাসযোগ্য না হয়

alter table dbo.City nocheck constraint FK_CountryID;

এবং আপনি একটি নতুন দেশ যুক্ত করুন

insert into dbo.Country(CountryID, Name) values(5, 'Iceland');

আপনি এই এত সুন্দর ছবি সঙ্গে শেষ হবে।

এখানে চিত্র বর্ণনা লিখুন

সূচীকরণ ভিউ আপডেট করার জন্য নীচের শাখাটি রয়েছে। এই টেবিলটিতে ইতিমধ্যে সারি সারি রয়েছে Cityএমন দেশটি নির্ধারণের জন্য এটি একটি সম্পূর্ণ টেবিল স্ক্যান CountryID = 5করে City

কীটি বিশ্বস্ত হলে, এসকিউএল সার্ভার জানে Cityযে এর মধ্যে নতুন সারিটির সাথে কোনও সারি থাকবে না Country


4

আপনি ক্যোয়ারী অপ্টিমাইজেশান হারাচ্ছেন। অনুশীলনে আমি কেবলমাত্র অপ্টিমাইজেশনকেই স্মরণ করি তা হ'ল অপ্রয়োজনীয় যোগদানের অপসারণ। উদাহরণস্বরূপ যদি আপনার একটি ভিউ থাকে:

select *
from Orders o
join Customers c on o.CustomerID = c.ID

এবং ভিউটি ব্যবহার করার সময় আপনি cতখনকার কলামগুলির ব্যবহার করবেন না যদি কোনও উপযুক্ত এফকে সেট আপ থাকে তবে সেই যোগদানটি মুছতে পারে।

আপনার EXISTSউদাহরণটি একটি অতিরিক্ত কাজ যোগাড় অপসারণের একটি বিশেষ ক্ষেত্রে case আমি মনে করি না যে নির্দিষ্ট উদাহরণটি কার্যত প্রাসঙ্গিক।

আপনি কোনও বিশ্বস্ত প্রতিবন্ধকতা সরবরাহ করে এমন কঠোর ডেটা অখণ্ডতাও হারাবেন।


3

NOCHECK বিকল্পটি টিনের উপরে যা বলেছে ঠিক তেমন করে।

এটি মূলত একটি টেবিলের অস্তিত্বের মধ্য দিয়ে অর্ধেক পথে বিদেশী কী যুক্ত করার জন্য ব্যবহৃত হয় যেখানে একটি নতুন সম্পর্ক রয়েছে যা সম্ভবত প্রয়োজন হয় নি (এটি আমার বোঝা অন্তত)।

এর অর্থ হ'ল বিদেশী কী MAY রয়েছে এমন কলামটির মধ্যে মান রয়েছে যা এটির সাথে সম্পর্কিত হওয়া নির্ধারিত মানের সাথে সম্পর্কিত নয়।

এর অর্থ হ'ল যখন আপনার এসকিউএল সার্ভারে কোনও কিছুই নেই তখন আসলে সেই মূল মানটি একটি প্রাথমিক কী কিনা তা পরীক্ষা করে দেখতে হবে। যদি কিছুই সেট না করা থাকে তবে এসকিউএল সার্ভার অনুমান করে যে column কলামটিতে যা আছে তা অবশ্যই উপস্থিত রয়েছে কারণ এটি ইতিমধ্যে প্রাথমিক কী না থাকলে টেবিলে প্রবেশের অস্তিত্ব থাকতে পারে না, এবং সারিটি সরিয়ে না দিয়ে আপনি প্রাথমিক কী মুছতে পারবেন না প্রশ্ন।

সহজভাবে কিছুই নয় এমন একটি বিদেশী কী যা আপনি কোনও কিছুর সাথে সম্পর্কিত হওয়ার জন্য বিশ্বাস করতে পারবেন না।

আপনি যে প্রাথমিক কীটি থাকার নিশ্চয়তা দিয়েছেন তা ছাড়া আপনি আসলে হারাচ্ছেন না।


সীমাবদ্ধতা শুরুর পরে বৈদেশিক কী কার্যকর করার কোনও প্রয়োগ রয়েছে কিনা তা আপনার উত্তর থেকে পরিষ্কার নয় clear আপনি যদি স্পষ্ট করে বলতে পারেন যে আপনি যদি INSERTএকটি নতুন সারিটি অস্তিত্বহীন পিতামাতার সারির সাথে সম্পর্কিত হয় বা আপনি যদি DELETEপরের দিকে সন্তানের সারি রয়েছে এমন একটি সারিটিতে চেষ্টা করেন তবে কী ঘটে?
jpmc26
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.