ในขณะที่อ่านหนังสือสอบ 70-433 ของฉันฉันคิดถึงสิ่งที่ฉันเห็นว่าไม่ทำงาน แต่ฉันเชื่อว่าเป็นเช่นนั้น บทความอ่านอะไรบางอย่างเช่น:
คอลัมน์ต้องถูกทำเครื่องหมายเป็นPERSISTEDซึ่งหมายความว่า SQL Server เก็บผลลัพธ์ของนิพจน์ของคอลัมน์ที่คำนวณไว้ในแถวข้อมูลแทนการคำนวณทุกครั้งที่มีการอ้างอิงในแบบสอบถาม
จากนี้ฉันเข้าใจสองสิ่ง:
- ไม่ใช่ยืนกรานคอลัมน์คำนวณจะคำนวณทุกครั้งที่มีการอ้างถึงในแบบสอบถาม
- เนื่องจากไม่มีสิ่งใดถูกเก็บไว้สำหรับคอลัมน์ที่คำนวณฉันจึงไม่สามารถสร้างดัชนีสำหรับคอลัมน์ได้
หลังจากอ่านแล้วฉันคิดว่ามันแปลกไปนิดหน่อยที่ฉันสามารถสร้างดัชนีในคอลัมน์ที่ไม่มีการยืนยันในโครงการก่อนหน้านี้
สามารถสร้างดัชนีสำหรับบางสิ่งที่ไม่คงอยู่ได้อย่างไรและเป็นอันตรายในระยะยาวหรือไม่
เพื่อพิสูจน์สิ่งนี้ฉันได้รันคำสั่ง SQL ต่อไปนี้:
CREATE TABLE testTable
(
ID INT IDENTITY(1,1) PRIMARY KEY,
telephone VARCHAR(14),
c_areaCode AS (SUBSTRING(telephone,0,5)),
cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)
INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');
CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);
แล้วเรียกใช้แบบสอบถามต่อไปนี้:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
เมื่อมองไปที่แผนแบบสอบถามสำหรับรหัสข้างต้นฉันจะเห็นว่าทั้งแบบสอบถามเลือกใช้ดัชนีที่ไม่ยืนยัน อีกครั้งได้อย่างไร
