Không có DBMS nào tôi biết có bất kỳ "tối ưu hóa" nào sẽ làm cho VARCHAR
một 2^n
chiều dài hoạt động tốt hơn một max
chiều dài không phải là sức mạnh bằng 2.
Tôi nghĩ rằng các phiên bản SQL Server đầu tiên thực sự đã xử lý một VARCHAR
độ dài 255 khác với một phiên bản có độ dài tối đa cao hơn. Tôi không biết nếu đây vẫn là trường hợp.
Đối với hầu hết tất cả DBMS, dung lượng lưu trữ thực tế được yêu cầu chỉ được xác định bởi số lượng ký tự bạn đặt vào nó, không phải max
độ dài bạn xác định. Vì vậy, từ quan điểm lưu trữ (và rất có thể là hiệu suất cũng vậy), nó không tạo ra bất kỳ sự khác biệt nào cho dù bạn khai báo một cột là VARCHAR(100)
hay VARCHAR(500)
.
Bạn sẽ thấy max
độ dài được cung cấp cho một VARCHAR
cột là một loại ràng buộc (hoặc quy tắc kinh doanh) chứ không phải là một điều kỹ thuật / vật lý.
Đối với PostgreSQL, thiết lập tốt nhất là sử dụng text
mà không giới hạn độ dài và CHECK CONSTRAINT
giới hạn số lượng ký tự cho bất kỳ doanh nghiệp nào của bạn yêu cầu.
Nếu yêu cầu đó thay đổi, việc thay đổi ràng buộc kiểm tra nhanh hơn nhiều so với thay đổi bảng (vì bảng không cần phải viết lại)
Điều tương tự có thể được áp dụng cho Oracle và những người khác - trong Oracle nó sẽ VARCHAR(4000)
thay thế text
mặc dù.
Tôi không biết có sự khác biệt về lưu trữ vật lý giữa VARCHAR(max)
và vd VARCHAR(500)
trong SQL Server không. Nhưng rõ ràng là có một tác động hiệu suất khi sử dụng varchar(max)
so với varchar(8000)
.
Xem liên kết này (được đăng bởi Erwin Brandstetter dưới dạng bình luận)
Chỉnh sửa 2013-09-22
Về bình luận của Bigown:
Trong các phiên bản Postgres trước 9.2 (không có sẵn khi tôi viết câu trả lời ban đầu), một thay đổi đối với định nghĩa cột đã viết lại toàn bộ bảng, xem ví dụ ở đây . Kể từ 9.2, đây không còn là trường hợp nữa và một thử nghiệm nhanh đã xác nhận rằng việc tăng kích thước cột cho một bảng có 1,2 triệu hàng thực sự chỉ mất 0,5 giây.
Đối với Oracle điều này dường như cũng đúng, đánh giá theo thời gian cần thiết để thay đổi varchar
cột của một bảng lớn . Nhưng tôi không thể tìm thấy bất kỳ tài liệu tham khảo cho điều đó.
Đối với MySQL , hướng dẫn sử dụng có nội dung " Trong hầu hết các trường hợp, hãy ALTER TABLE
tạo một bản sao tạm thời của bảng gốc ". Và các thử nghiệm của riêng tôi xác nhận rằng: chạy ALTER TABLE
một bảng trên 1,2 triệu hàng (giống như trong thử nghiệm của tôi với Postgres) để tăng kích thước của một cột mất 1,5 phút. Tuy nhiên, trong MySQL, bạn không thể sử dụng "cách giải quyết" để sử dụng ràng buộc kiểm tra để giới hạn số lượng ký tự trong một cột.
Đối với SQL Server, tôi không thể tìm thấy một tuyên bố rõ ràng về điều này nhưng thời gian thực hiện để tăng kích thước của một varchar
cột (một lần nữa bảng 1,2 triệu hàng ở trên) chỉ ra rằng không có ghi lại diễn ra.
Chỉnh sửa 2017-01-24
Có vẻ như tôi (ít nhất là một phần) sai về SQL Server. Xem câu trả lời này của Aaron Bertrand cho thấy độ dài được khai báo của một nvarchar
hoặc varchar
các cột tạo ra sự khác biệt rất lớn cho hiệu suất.