Tôi có nên luôn luôn sử dụng (n)varchar(max)
cho các cột văn bản?
Không.
Đối với SQL Server, các max
loại dữ liệu chỉ nên được chỉ định khi không có sự thay thế. Thay vào đó, người ta nên chọn loại cơ sở chính xác ( varchar
hoặc nvarchar
) và chỉ định độ dài tối đa rõ ràng phù hợp với dữ liệu sẽ được lưu trữ.
Lưu trữ vật lý là giống hệt nhau cho dù cột được gõ là varchar(n)
hay varchar(max)
, vì vậy đó không phải là mối quan tâm.
Những lý do để không chọn (n)varchar(max)
ở mọi nơi xoay quanh các tính năng, chất lượng kế hoạch và hiệu suất.
Một danh sách đầy đủ có lẽ không thực tế, nhưng trong số những thứ khác, max
các cột:
Tính năng, đặc điểm
- Yêu cầu một ràng buộc riêng để thực thi độ dài tối đa
- Không thể là một khóa trong một chỉ mục (vì vậy cũng không có ràng buộc duy nhất nào)
- Có thể ngăn DDL trực tuyến (bao gồm xây dựng lại chỉ mục và thêm cột không null mới)
- Nói chung không được hỗ trợ cho các tính năng 'mới hơn', ví dụ: cột
- Xem tài liệu sản phẩm để biết các tính năng và giới hạn cụ thể hơn. Mô hình chung là có những hạn chế và hạn chế khó xử xung quanh
max
các loại dữ liệu. Không phải tất cả các hạn chế và tác dụng phụ được ghi lại.
Hiệu suất
- Yêu cầu xử lý đặc biệt trong công cụ thực thi, để tính kích thước rất lớn. Thông thường, điều này liên quan đến việc sử dụng đường dẫn mã kém hiệu quả hơn, với giao diện phát trực tuyến
- Có thể có các hậu quả không lường trước được tương tự đối với mã bên ngoài (và các thành phần SQL Server khác như SSIS), cũng phải được chuẩn bị để xử lý dữ liệu có kích thước tối đa 2GB
- Được giả định là rộng 4000 byte trong tính toán cấp bộ nhớ. Điều này có thể dẫn đến việc dự trữ bộ nhớ quá mức, làm hạn chế sự tương tranh và đẩy các trang dữ liệu và chỉ mục có giá trị ra khỏi bộ nhớ đệm
- Vô hiệu hóa một số tối ưu hóa hiệu suất quan trọng
- Có thể kéo dài thời gian khóa
- Có thể ngăn trình tối ưu hóa chọn kế hoạch tìm kiếm (không động)
- Ngăn chặn các bộ lọc bị đẩy vào quét và tìm kiếm như một phần dư
- Có thể làm tăng áp lực và sự tranh chấp tempdb (phụ thuộc phiên bản), vì các biến và tham số cũng có khả năng được nhập
max
vào để khớp với các định nghĩa cột
Tóm lại, có rất nhiều tác dụng phụ tinh tế (và không mong muốn) của việc sử dụng bộ max
xác định một cách không cần thiết đến mức không có ý nghĩa gì để làm điều này. 'Tiện lợi' nhỏ của việc sử dụng một tuyên bố là không có loại bồi thường.
Đánh giá từng loại trong ngữ cảnh, sử dụng đúng loại cơ sở ( varchar
hoặc nvarchar
) và độ dài rõ ràng hợp lý.
Đọc thêm: