Trong khi đọc qua cuốn sách kiểm tra 70-433 của tôi, tôi nghĩ về một cái gì đó mà tôi có thể thấy không hoạt động, nhưng tôi tin rằng nó có. Đoạn văn đọc một cái gì đó như:
Cột cũng phải được đánh dấu là PERSISTED , có nghĩa là SQL Server lưu trữ vật lý kết quả của biểu thức của cột được tính trong hàng dữ liệu thay vì tính toán mỗi lần nó được tham chiếu trong truy vấn.
Từ đây tôi hiểu hai điều:
- Một cột được tính không tồn tại được tính mỗi lần nó được tham chiếu trong truy vấn
- Vì không có gì được lưu trữ cho cột được tính toán, tôi giả sử không có chỉ mục nào có thể được tạo cho cột.
Sau khi đọc nó, tôi nghĩ rằng điều này hơi lạ vì tôi đã cố gắng tạo ra một chỉ mục trên một cột không tồn tại trong một dự án trước đó.
Làm thế nào một chỉ mục có thể được tạo ra cho một cái gì đó không tồn tại và điều này có bất lợi về lâu dài?
Để chứng minh điều này tôi đã chạy câu lệnh SQL sau:
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);
Và sau đó chạy các truy vấn sau:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Đã xem xét kế hoạch truy vấn cho đoạn mã trên, tôi có thể thấy rằng cả hai truy vấn chọn đều đang sử dụng chỉ mục không tồn tại. Một lần nữa, làm thế nào?