Örneğinizle keşfettiğiniz gibi exists
SQL Server, sorgu planı oluşturulduğunda yabancı bir anahtarın güvenilir olması gerçeğini kullanabilir.
NOCHECK kullanarak kaybettiğim başka bir şey var mı?
Ste Bov tarafından yanıtlandığı gibi olmaması gereken bir sütuna değerler ekleyebilmeniz dışında , yabancı anahtar güvenilir olduğunda sorgu planının daha iyi olacağı daha fazla senaryoya sahip olacaksınız.
Dizine alınmış bir görünüme sahip bir örnek .
Güvenilir bir FK kısıtlamasına sahip iki tablonuz var.
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);
Çok fazla ülke yok ama bir milyon şehir var ve bazıları büyük şehirler.
Örnek veri:
-- 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;
Bu uygulamada en sık yürütülen sorgular, ülke başına büyük şehirlerin sayısını bulmakla ilgilidir. Bunu hızlandırmak için dizine eklenmiş bir görünüm ekliyoruz.
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);
Bir süre sonra yeni bir ülke ekleme talebi geliyor
insert into dbo.Country(CountryID, Name) values(4, 'Finland');
Bu ek için sorgu planının sürprizleri yoktur.
Tabloya kümelenmiş dizin ekleme Country
.
Şimdi, yabancı anahtarınıza güvenilmediyse
alter table dbo.City nocheck constraint FK_CountryID;
ve yeni bir ülke eklersin
insert into dbo.Country(CountryID, Name) values(5, 'Iceland');
Sonunda bu kadar hoş olmayan bir resim elde edersiniz.
Alt dal, dizinlenmiş görünümü güncellemek için oradadır. Tabloda zaten satırları City
olan ülkenin olup olmadığını anlamak için tam bir tablo taraması yapar .CountryID = 5
City
Anahtar güvenilir olduğunda, SQL Server içinde City
yeni satırla eşleşen hiçbir satır olmadığını bilir Country
.
INSERT
Mevcut olmayan bir üst satırla ilgili yeni bir satıra çalışırsanız veyaDELETE
daha sonra alt satırları olan bir satıra çalışırsanız ne olacağını açıklığa kavuşturabilir misiniz ?