ตามที่คุณได้ค้นพบกับexists
ตัวอย่างของคุณSQL Server สามารถใช้ข้อเท็จจริงที่ว่าคีย์ต่างประเทศเชื่อถือได้เมื่อสร้างแผนแบบสอบถาม
มีอะไรอีกบ้างที่ฉันแพ้โดยใช้ NOCHECK
นอกเหนือจากข้อเท็จจริงที่ว่าคุณสามารถเพิ่มค่าลงในคอลัมน์ที่ไม่ควรอยู่ที่นั่นตามคำตอบของSte Bovคุณจะมีสถานการณ์เพิ่มเติมที่แผนการสืบค้นจะดีขึ้นเมื่อคีย์ต่างประเทศเชื่อถือได้
นี่คือตัวอย่างหนึ่งที่มีมุมมองที่จัดทำดัชนีไว้
คุณมีสองตารางที่มีข้อ จำกัด FK ที่เชื่อถือได้
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
อยู่แล้ว
เมื่อที่สำคัญคือการที่เชื่อถือได้, SQL Server รู้ว่าจะมีแถวในการที่จะตรงกับแถวใหม่ในCity
Country
INSERT
แถวใหม่ที่เกี่ยวข้องกับแถวหลักที่ไม่มีอยู่หรือถ้าคุณลองDELETE
แถวที่มีแถวลูกในภายหลัง