cột tính toán, chỉ mục, chỉ mục cụm và chỉ số bao gồm?


7

Chúng ta đều biết rằng chúng ta chỉ có thể có một chế độ xem theo cụm cho mỗi bảng, thật tuyệt. Nhưng rõ ràng bạn không có giá trị của các cột được tính toán trên lá ngay cả khi sử dụng chỉ mục được nhóm và chúng được tính toán mỗi lần.
Vì vậy, câu hỏi đầu tiên của tôi là, có đúng như những gì tôi vừa nói không?

Ngoài ra, nếu bạn tạo một chỉ mục được phân cụm, tôi xin phép trích dẫn ..
"Nếu bạn tạo một chỉ mục được nhóm trên một cột được tính toán, các giá trị của cột sẽ tồn tại về mặt vật lý trong các hàng của bảng tương ứng, bởi vì các trang lá của chỉ mục được nhóm hàng dữ liệu. "
Vâng, được thôi, nhưng tại sao chỉ tạo chỉ mục cụm trên cột được tính? Tôi nghĩ nếu bạn tạo một chỉ mục cụm trên bất kỳ cột nào thì dữ liệu tồn tại trên lá?
Vì vậy, Ques 2 của tôi là giá trị của cột được tính tồn tại (tồn tại) trong bảng nếu chúng ta chỉ tạo một chỉ mục được nhóm trên cột cụ thể đó? (câu hỏi 2 tiếp tục) Nếu đó thực sự là trường hợp, nếu chúng ta có nhiều hơn một cột được tính thì sao? chắc chắn, chúng ta không thể tạo nhiều hơn một chỉ mục được nhóm, hơn là làm thế nào để chúng ta làm cho giá trị của chúng bền bỉ?

Bây giờ di chuyển trên, những gì về các chỉ số bao gồm? Đầu tiên, chúng tôi không thực sự cần che (hoặc chúng tôi thực sự không thể tạo) bao gồm chỉ số trong khi tạo chỉ mục được nhóm vì tất cả dữ liệu đã có trên lá, phải không? Vì vậy, không có điểm bao gồm bất kỳ cột nào khác?
Vì vậy, thứ ba tôi muốn hỏi, tôi có đúng về những gì tôi vừa nói trong tuyên bố trước đây không?

Bây giờ nếu chúng ta đang tạo một chỉ mục bao phủ, (không phân cụm phải không?) Và chúng tôi bao gồm (các) cột được tính toán, thì chúng tôi có tồn tại không? họ sẽ được "lưu trữ vật lý" hoặc tính toán lại? (và đó là ques thứ 4. Nhân tiện.)

Cuối cùng, (câu hỏi thứ 5) nếu chúng ta có thể đạt được điều tương tự (duy trì các cột được tính toán) bằng tất cả các cách này (hoặc một số trong những cách này, tôi không thực sự biết cách nào, đó là lý do tại sao tôi đặt câu hỏi ngay từ đầu!) Sau đó, phương pháp tốt nhất để áp dụng là gì và tại sao?

ps: Tôi xin lỗi nếu đã hỏi 5 câu hỏi chỉ trong một lần, nhưng tất cả chúng đều liên quan khủng khiếp và tôi không muốn hỏi điều tương tự lặp đi lặp lại trong 5 câu hỏi khác nhau. Tôi hy vọng bạn hiểu! :)

EDIT: đáp lại các bình luận, ngay bây giờ tôi đang sử dụng máy chủ SQL 2008, nhưng nếu bạn có thể cung cấp tình huống sẽ khác như thế nào nếu sử dụng bất cứ thứ gì khác (sql của tôi hoặc bất cứ điều gì) sẽ được thêm lợi ích cho không chỉ tôi mà còn cho cộng đồng . :)

Câu trả lời:


4

Cột được tính toán có thể được lưu trữ trong trang dữ liệu theo một trong hai cách. Hoặc bằng cách tạo chúng như PERSISTEDhoặc bằng cách đưa chúng vào định nghĩa chỉ mục cụm.

Nếu chúng được bao gồm trong định nghĩa chỉ mục cụm thì ngay cả khi các cột không được đánh dấu là PERSISTEDthì các giá trị vẫn sẽ được lưu trữ trong mỗi hàng. Các giá trị khóa chỉ mục này cũng sẽ được lưu trữ trong các trang cấp cao hơn.

Nếu cột được tính không chính xác (ví dụ float) hoặc không thể xác minh là xác định (ví dụ: hàm CLR) thì yêu cầu cột phải được đánh dấu là PERSISTEDđể trở thành một phần của khóa chỉ mục.

Vì vậy, để đưa ra một ví dụ

CREATE TABLE T
(
A INT,
C1 AS REPLICATE(CHAR(A),100) PERSISTED,
C2 AS REPLICATE(CHAR(A),200),
C3 AS CAST(A AS FLOAT) PERSISTED,
C4 AS CAST(A + 1 AS FLOAT)
)

CREATE UNIQUE CLUSTERED INDEX IX ON T(C2,C3)
  • C1sẽ được lưu trữ chỉ trong các hàng của trang dữ liệu vì nó được đánh dấu là PERSISTEDnhưng không được lập chỉ mục.
  • C2 sẽ được lưu trữ trong cả hai hàng trên trang dữ liệu và chỉ mục ở mức cao hơn vì đây là cột khóa chỉ mục.
  • C3sẽ được lưu trữ như cho C2. Vì nó là imprecisemột yêu cầu để đánh dấu nó là PERSISTEDtuy nhiên.
  • C4sẽ không được lưu trữ ở bất cứ đâu vì nó không được đánh dấu là PERSISTEDcũng không được lập chỉ mục.

Tương tự, tất cả các cột được tính toán được tham chiếu trong các định nghĩa chỉ mục không được nhóm vì các cột chính cần được lưu trữ ở tất cả các cấp của chỉ mục vì chúng là một phần của khóa chỉ mục. Có cùng một yêu cầu liên quan đến kết quả chính xác / xác định.

Thất bại

CREATE NONCLUSTERED INDEX IX2 ON T(A,C4)

Với lỗi.

Không thể tạo chỉ mục hoặc thống kê 'IX2' trên bảng 'T' vì cột được tính toán 'C4' không chính xác và không được duy trì. Xem xét loại bỏ cột khỏi chỉ mục hoặc khóa thống kê hoặc đánh dấu cột được tính vẫn tồn tại.

Để bao gồm nó như là một phần của khóa chỉ mục không được phân cụm, nó cũng phải được lưu trữ trong các trang dữ liệu chỉ mục được phân cụm. Tuy nhiên

Thành công.

CREATE NONCLUSTERED INDEX IX2 ON T(A) INCLUDE (C4)

Các cột được tính toán chỉ có INCLUDEcác cột d được duy trì ở trang lá NCI và không có yêu cầu rằng chúng cũng phải được duy trì trong trang dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.