Seperti yang telah Anda temukan dengan exists
contoh Anda , SQL Server dapat menggunakan fakta bahwa kunci asing dipercaya ketika rencana kueri dibuat.
Apakah ada hal lain yang saya kehilangan dengan menggunakan NOCHECK?
Terlepas dari kenyataan bahwa Anda dapat menambahkan nilai ke kolom yang seharusnya tidak ada di sana seperti dijawab oleh Ste Bov Anda akan memiliki lebih banyak skenario di mana rencana kueri akan lebih baik ketika kunci asing dipercaya.
Berikut adalah satu contoh dengan tampilan yang diindeks .
Anda memiliki dua tabel dengan batasan FK tepercaya.
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);
Tidak ada banyak negara tetapi trilyun kota dan beberapa dari mereka adalah kota besar.
Contoh data:
-- 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;
Kueri yang paling sering dieksekusi dalam aplikasi ini terkait dengan menemukan jumlah kota besar per negara. Untuk mempercepat dengan itu kami menambahkan tampilan yang diindeks.
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);
Setelah beberapa saat muncul permintaan untuk menambah negara baru
insert into dbo.Country(CountryID, Name) values(4, 'Finland');
Paket kueri untuk sisipan itu tidak memiliki kejutan.
Masukkan indeks berkerumun ke Country
tabel.
Sekarang, jika kunci asing Anda tidak dipercaya
alter table dbo.City nocheck constraint FK_CountryID;
dan Anda menambahkan negara baru
insert into dbo.Country(CountryID, Name) values(5, 'Iceland');
Anda akan berakhir dengan gambar yang tidak begitu cantik ini.
Cabang bawah ada untuk memperbarui tampilan yang diindeks. Itu memindai tabel penuh City
untuk mengetahui apakah negara dengan CountryID = 5
sudah memiliki baris dalam tabel City
.
Ketika kunci dipercaya, SQL Server tahu tidak ada baris City
yang cocok dengan baris baru di Country
.
INSERT
baris baru yang terkait dengan baris induk yang tidak ada atau jika Anda mencobaDELETE
baris yang memiliki baris anak nanti?