พฤติกรรมแปลก ๆ กับคอลัมน์ที่คำนวณใน SQL-Server


12

ในขณะที่อ่านหนังสือสอบ 70-433 ของฉันฉันคิดถึงสิ่งที่ฉันเห็นว่าไม่ทำงาน แต่ฉันเชื่อว่าเป็นเช่นนั้น บทความอ่านอะไรบางอย่างเช่น:

คอลัมน์ต้องถูกทำเครื่องหมายเป็นPERSISTEDซึ่งหมายความว่า SQL Server เก็บผลลัพธ์ของนิพจน์ของคอลัมน์ที่คำนวณไว้ในแถวข้อมูลแทนการคำนวณทุกครั้งที่มีการอ้างอิงในแบบสอบถาม

จากนี้ฉันเข้าใจสองสิ่ง:

  1. ไม่ใช่ยืนกรานคอลัมน์คำนวณจะคำนวณทุกครั้งที่มีการอ้างถึงในแบบสอบถาม
  2. เนื่องจากไม่มีสิ่งใดถูกเก็บไว้สำหรับคอลัมน์ที่คำนวณฉันจึงไม่สามารถสร้างดัชนีสำหรับคอลัมน์ได้

หลังจากอ่านแล้วฉันคิดว่ามันแปลกไปนิดหน่อยที่ฉันสามารถสร้างดัชนีในคอลัมน์ที่ไม่มีการยืนยันในโครงการก่อนหน้านี้

สามารถสร้างดัชนีสำหรับบางสิ่งที่ไม่คงอยู่ได้อย่างไรและเป็นอันตรายในระยะยาวหรือไม่


เพื่อพิสูจน์สิ่งนี้ฉันได้รันคำสั่ง 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;

เมื่อมองไปที่แผนแบบสอบถามสำหรับรหัสข้างต้นฉันจะเห็นว่าทั้งแบบสอบถามเลือกใช้ดัชนีที่ไม่ยืนยัน อีกครั้งได้อย่างไร

ป้อนคำอธิบายรูปภาพที่นี่


สำหรับผู้ที่มีหนังสือ 70-433, ข้อความที่ยกมาอยู่ที่ด้านบนของหน้า 111
สจวตแบล็คเลอ ร์

คำตอบ:


9

2. เนื่องจากไม่มีสิ่งใดถูกเก็บไว้สำหรับคอลัมน์ที่คำนวณได้ฉันถือว่าไม่มีดัชนีใด ๆ ที่สามารถสร้างสำหรับคอลัมน์ได้

สมมติฐานนี้ไม่เป็นความจริง - ทั้งชนิดสามารถจัดทำดัชนี คอลัมน์ที่คำนวณต้องถูกกำหนดไว้ไม่ว่าในกรณีใด แต่เมื่อคอลัมน์ที่คำนวณถูกยืนยันความต้องการที่การคำนวณนั้นแม่นยำก็จะผ่อนคลาย (เช่นสามารถดำเนินการกับจุดลอยตัว)

สามารถสร้างดัชนีสำหรับบางสิ่งที่ไม่คงอยู่ได้อย่างไรและเป็นอันตรายในระยะยาวหรือไม่

ผลลัพธ์ของฟังก์ชันคือ 'ยืนยัน' ในดัชนีในทั้งสองกรณี - ความแตกต่างเพียงอย่างเดียวคือไม่ว่าจะคงอยู่ในตารางหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.