Bằng cách sử dụng VARCHAR(MAX)
về cơ bản bạn đang nói với SQL Server "lưu trữ các giá trị trong trường này theo cách bạn thấy tốt nhất", SQL Server sau đó sẽ chọn có lưu trữ các giá trị dưới dạng VARCHAR
thông thường hay không hoặc như một LOB (Đối tượng lớn). Nói chung, nếu các giá trị được lưu trữ nhỏ hơn 8.000 byte, SQL Server sẽ coi các giá trị là một VARCHAR
thông thường loại.
Nếu các giá trị được lưu trữ quá lớn thì cột được phép tràn ra khỏi trang vào các trang LOB, chính xác như cách chúng làm đối với các loại LOB khác (text
, ntext
và image
) - nếu điều này xảy ra thì các lần đọc trang bổ sung được yêu cầu để đọc dữ liệu được lưu trữ trong các trang bổ sung (tức là có một hiệu suất penatly), tuy nhiên điều này chỉ xảy ra nếu các giá trị được lưu trữ quá lớn .
Trên thực tế, trong SQL Server 2008 trở lên, dữ liệu có thể tràn sang các trang bổ sung ngay cả với các kiểu dữ liệu có độ dài cố định (ví dụ:VARCHAR(3,000)
), tuy nhiên những trang này được gọi là trang dữ liệu tràn hàng và được xử lý hơi khác một chút.
Phiên bản ngắn: từ góc độ lưu trữ, không có bất lợi khi sử dụng VARCHAR(MAX)
qua VARCHAR(N)
cho một số N
.
(Lưu ý rằng điều này cũng áp dụng cho các loại trường có độ dài thay đổi khác NVARCHAR
và VARBINARY
)
FYI - Bạn không thể tạo chỉ mục trên VARCHAR(MAX)
cột