Tôi biết rằng khi VARCHAR(MAX)/NVARCHAR(MAX)
các cột được sử dụng, dữ liệu được lưu trữ ngoài hàng ...
Trên thực tế, điều đó phụ thuộc vào cài đặt của large value types out of row
tùy chọn, có thể được đặt bằng cách sử dụng sp_tableoption
. Từ tài liệu :
Các mặc định là dành cho MAX
các giá trị được lưu trữ trong hàng , lên đến 8000 byte, nếu họ phù hợp. Trừ khi bạn đã sử dụng sp_tableoption
để thay đổi mặc định, MAX
rất có thể dữ liệu của bạn sẽ được lưu liên tiếp.
Điều đó nói rằng, việc sử dụng MAX
các loại dữ liệu cho các giá trị sẽ không bao giờ vượt quá 8000 byte - thực tế là sử dụng loại không phải MAX. Ngoài bất cứ điều gì khác, hiệu suất thường kém hơn đáng kể khi xử lý các MAX
loại, vì SQL Server phải được chuẩn bị để đối phó với dữ liệu có thể có kích thước lên tới 2GB.
Là mỗi trường được lưu trữ ngoài hàng hoặc chỉ những trường tối đa?
Chỉ có MAX
những người. Ngoài ra, nếu một MAX
cột liên tiếp trước đó được di chuyển ra khỏi hàng, chỉ có cột đó trong hàng đó bị ảnh hưởng. Nó được thay thế trong hàng bằng một con trỏ tới LOB
cấu trúc off-row . Cũng có trường hợp các cột không MAX có thể được chuyển ra khỏi hàng.
Nếu bạn đang sử dụng chỉ mục được nhóm của bảng để đọc toàn bộ bản ghi, thì các trường cũng được lưu trữ ngoài hàng đã đọc chưa?
Quét chỉ mục được nhóm đi qua dữ liệu liên tiếp. Nếu dữ liệu ngoài hàng là cần thiết cho truy vấn, nó được tra cứu bằng con trỏ liên tiếp.