2012-01-27 62 views
12

thể trùng lặp:
is there an advantage to varchar(500) over varchar(8000)?Sự khác biệt giữa varchar (5) và varchar (5000)?

Trong SQL Server chúng ta có thể xác định loại lĩnh vực varchar(n):

kích thước lưu trữ là độ dài thực tế tính bằng byte của dữ liệu nhập vào, không phải n byte.

Thông thường khi lập kế hoạch một cấu trúc cơ sở dữ liệu tôi cố gắng tưởng tượng độ dài tối đa có thể của chuỗi đó sẽ được lưu trữ trong các varchar lĩnh vực và sau đó thiết lập kích thước tưởng tượng + một số sao lưu cho trường varchar. Đôi khi nó có thể xảy ra rằng các phòng ban đầu được cung cấp là không đủ cho lĩnh vực này và sau đó tôi cần phải tăng chiều dài.

Nhưng thực tế, có đáng để giới hạn trường varchar thành một số giá trị và không chỉ đặt một số giá trị như varchar(5000) hoặc thậm chí varchar(max) 100% phù hợp với trường hợp này không? Có lợi thế nào trong tổ chức trang trong SQL Server hoặc tổ chức chỉ mục khi tôi giới hạn độ dài n không?

Cập nhật

Dưới đây là những gì tôi có ý nghĩa (lợi thế): https://stackoverflow.com/a/5353196/355264

Vâng, tôi ưu truy vấn có thể đoán bao nhiêu hàng phù hợp trong một trang, nếu bạn có rất nhiều các trường varchar lớn hơn mức cần thiết, SQL Máy chủ có thể đoán sai số lượng hàng.

Điều trên có đúng không? Và có lợi thế nào khác không?

+1

có thể trùng lặp của [là có một lợi thế để varchar (500) trên varchar (8000)?] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to -varchar500-over-varchar8000) hoặc của [varchar (ma x) ở khắp mọi nơi?] (http://stackoverflow.com/questions/2091284/varcharmax-everywhere) hoặc của [SQL Server VARCHAR Chiều rộng cột] (http://dba.stackexchange.com/questions/11614/sql-server- VARCHAR-column-width) –

+0

RE: Chỉnh sửa của bạn. Xem [câu trả lời của tôi ở đây] (http://stackoverflow.com/questions/2009694/is-there-an-advantage-to-varchar500-over-varchar8000/5654947#5654947) –

Trả lời

17

Đối với một điều - bạn KHÔNG THỂ lập chỉ mục bất kỳ cột nào có kích thước trên 900 byte.

Điều đó một mình (với tôi) là một tiêu chí kẻ giết người chống lại sử dụng varchar(5000) (hoặc varchar(max)) tất cả các thời gian, ngay cả khi không cần thiết ....

Sử dụng kích thước thích hợp.

Ngoài ra: varchar thêm ít nhất 2 byte trên cao, vì vậy đối với chuỗi có 10 ký tự trở xuống, tôi luôn khuyên bạn nên sử dụng char(n) thay thế.

char(5) sẽ sử dụng 5 byte bộ nhớ - luôn luôn. varchar(5) sử dụng từ 2 đến 7 byte dung lượng lưu trữ.

+2

Vì vậy, thực sự 'varchar (15)' sẽ là giống như 'varchar (500)' trong các điều khoản về hiệu quả và tốc độ, phải không? I E. nếu tôi nghĩ rằng các dữ liệu sẽ được khoảng 15-20 byte (có thể ít hơn hoặc lâu hơn một chút) Tôi chỉ có thể chỉ định 'varchar (150)'? Đây thực sự là câu hỏi chính của tôi. –

+0

Tôi không hiểu rằng "luôn luôn" ... câu hỏi được giữa việc sử dụng các quy tắc varchar (500) hoặc varchar (tối đa) ra bất kỳ gợi ý rằng các chuỗi thường sẽ là 10 ký tự hoặc ít hơn. –

+1

Cột thuộc loại 'char (100)' sẽ ** luôn ** chính xác 100 ký tự - ngay cả khi bạn chỉ lưu trữ 'Isaac' trong nó, nó sẽ được đệm thành độ dài xác định (100 ký tự) với dấu cách - vì vậy thực sự bạn đang lưu trữ 'Isaac ....................' - đó là không hiệu quả cao –

12

MS SQL Server lưu trữ varchar (8000) và ngắn hơn khác với varchar (MAX).

Kích thước mà tại đó các loại MAX được di chuyển ra khỏi các trang dữ liệu của bảng và vào các trang dữ liệu riêng của nó bây giờ là cố định tại 8.000 byte nếu [giá trị lớn loại ra khỏi hàng] được thiết lập để OFF.

Có nhiều lý do tại sao bạn sẽ sử dụng sử dụng varchar (n) chứ không phải là varchar (MAX)

Performance

varchar (n) được nhanh hơn http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/

Indexing

varchar (900) và nhỏ hơn có thể được lập chỉ mục, nhưng không varchar (MAX) hoặc varchar (901) hoặc lớn hơn

Compatibility

MS SQL Server Compact Edition không hỗ trợ varchar (MAX)

Các vấn đề liên quan