Thứ tự của các cột trong chỉ mục PK có quan trọng không?
Có nó làm.
Theo mặc định, ràng buộc khóa chính được thi hành trong SQL Server bởi một chỉ mục được nhóm duy nhất. Chỉ mục cụm xác định thứ tự logic của các hàng trong bảng. Có thể có một số trang chỉ mục bổ sung được thêm vào để thể hiện các mức cao hơn của chỉ mục cây b, nhưng mức (lá) thấp nhất của chỉ mục được nhóm đơn giản là thứ tự logic của chính dữ liệu.
Để rõ ràng về nó, các hàng trên một trang không nhất thiết phải được lưu trữ vật lý theo thứ tự khóa chỉ mục được nhóm. Có một cấu trúc gián tiếp riêng biệt trong trang lưu trữ một con trỏ tới mỗi hàng. Cấu trúc này được sắp xếp theo các khóa chỉ mục cụm. Ngoài ra, mỗi trang có một con trỏ đến trang trước và trang tiếp theo ở cùng cấp theo thứ tự khóa chỉ mục được nhóm.
Với khóa chính được nhóm (RowNumber, DataDate)
, các hàng được sắp xếp một cách hợp lý trước RowNumber
và sau đó DataDate
- vì vậy tất cả các hàng RowNumber = 1
được nhóm hợp lý với nhau, sau đó các hàng ở đâu RowNumber = 2
và cứ thế.
Khi bạn thêm dữ liệu mới (có RowNumbers
từ 1 đến n), các hàng mới thuộc về các trang hiện có một cách hợp lý, do đó, SQL Server có thể sẽ phải thực hiện rất nhiều công việc tách trang để tạo khoảng trống. Tất cả hoạt động này tạo ra rất nhiều công việc phụ (bao gồm ghi nhật ký các thay đổi) mà không thu được lợi nhuận.
Các trang phân tách cũng bắt đầu trống khoảng 50%, do đó việc chia quá nhiều có thể dẫn đến mật độ trang thấp (ít hàng hơn tối ưu trên mỗi trang). Đây không chỉ là tin xấu cho việc đọc từ đĩa (mật độ thấp hơn = nhiều trang hơn để đọc), các trang có mật độ thấp hơn cũng chiếm nhiều chỗ hơn trong bộ nhớ khi được lưu trữ.
Thay đổi chỉ mục được phân cụm thành (DataDate, RowNumber
) có nghĩa là dữ liệu mới (có lẽ, cao DataDates
hơn mức được lưu trữ hiện tại) được gắn vào phần cuối logic của chỉ mục được phân cụm trên các trang mới. Điều này sẽ loại bỏ các chi phí không cần thiết của việc chia trang và dẫn đến thời gian tải nhanh hơn. Dữ liệu bị phân mảnh ít hơn cũng có nghĩa là hoạt động đọc trước (đọc các trang từ đĩa ngay trước khi chúng cần cho truy vấn đang thực hiện) có thể hiệu quả hơn.
Nếu không có gì khác, các truy vấn của bạn có nhiều khả năng tìm kiếm DataDate
hơn RowNumber
. Một chỉ mục được nhóm trên (DataDate, RowNumber
) hỗ trợ tìm kiếm chỉ mục trên DataDate
(và sau đó RowNumber
). Sự sắp xếp hiện tại chỉ hỗ trợ tìm kiếm trên RowNumber
(và chỉ sau đó, có lẽ, trên DataDate
). Bạn cũng có thể bỏ chỉ mục không bao gồm hiện tại vào DataDate
khi khóa chính được thay đổi. Chỉ mục được nhóm sẽ rộng hơn chỉ mục không bao gồm nó thay thế, vì vậy bạn nên kiểm tra để đảm bảo rằng hiệu suất vẫn được chấp nhận.
Khi nhập dữ liệu mới với bcp
, bạn có thể có hiệu suất cao hơn nếu dữ liệu trong tệp nhập được sắp xếp theo các khóa chỉ mục được nhóm (lý tưởng (DataDate, RowNumber
)) và bạn chỉ định bcp
tùy chọn:
-h "ORDER(DataDate,RowNumber), TABLOCK"
Để có hiệu suất tải dữ liệu tốt nhất, bạn có thể cố gắng đạt được các bản ghi được ghi lại tối thiểu. Để biết thêm thông tin, xem: