Sử dụng kích thước cột lớn hơn nhiều so với cần thiết


16

Tôi đang tạo cơ sở dữ liệu SQL Server với người khác. Một trong các bảng là nhỏ (6 hàng) với dữ liệu có thể sẽ không đổi. Có một khả năng từ xa rằng một hàng mới sẽ được thêm vào. Bảng trông giống như thế này:

CREATE TABLE someTable (
    id int primary key identity(1,1) not null,
    name varchar(128) not null unique
    );
INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here');

Tôi đang xem xét độ dài char của namecột đó và tôi nghĩ rằng giá trị của nó có lẽ sẽ không bao giờ lớn hơn, giả sử, 32 ký tự, thậm chí có thể không lớn hơn 24. Có bất kỳ lợi thế nào khi tôi thay đổi cột này thành, ví dụ varchar(32)?

Ngoài ra, có bất kỳ lợi thế nào để giữ kích thước cột mặc định thành bội số của 4, 8, 32, v.v. không?

Câu trả lời:


15

SQL Server sử dụng độ dài cột khi phân bổ bộ nhớ để xử lý truy vấn. Vì vậy, vâng, trong ngắn hạn, bạn phải luôn luôn kích thước các cột phù hợp cho dữ liệu.

Phân bổ bộ nhớ dựa trên số lượng hàng được trả về bởi truy vấn nhân với một nửa chiều dài khai báo của cột.

Phải nói rằng, trong trường hợp này bạn có 6 hàng, có lẽ bạn không muốn tối ưu hóa quá sớm. Trừ khi bạn THAM GIA bảng này với bảng khác với hàng triệu hàng, sẽ không có sự khác biệt lớn giữa varchar (24) và varchar (32), hoặc thậm chí là varchar (128).

Câu hỏi thứ hai của bạn hỏi về việc căn chỉnh độ dài cột trên bội số nhị phân. Điều đó hoàn toàn không cần thiết vì SQL Server lưu trữ tất cả dữ liệu trong các trang 8KB, bất kể độ dài của mỗi cột.


14

Với 6 hàng, không, sẽ không có lợi ích quan sát được. Toàn bộ bảng sẽ vừa trên một trang để giảm không gian tiềm năng tối đa bạn sẽ sử dụng trên trang đó trong khi vẫn chiếm toàn bộ trang đó thực sự không khác biệt theo nghĩa thực tế.

Tuy nhiên, trên các bảng lớn hơn, kích thước phải là rất quan trọng. Lý do là ước tính bộ nhớ sẽ dựa trên giả định rằng mọi giá trị sẽ được chiếm 50%. Vì vậy, nếu bạn có varchar (128), mọi giá trị sẽ chiếm 64 byte, bất kể dữ liệu thực tế, do đó, cấp bộ nhớ sẽ là 64b * số hàng. Nếu tất cả các giá trị sẽ có từ 32 ký tự trở xuống, làm cho nó trở thành một varchar (64) hoặc thậm chí varchar (32) có lẽ là một lựa chọn tốt hơn. Nếu một tỷ lệ lớn các giá trị gần hoặc ở mức tối đa, bạn thậm chí có thể lập luận cho char để lấy sự biến động ra khỏi nó.

Về lợi ích của việc có độ dài chuỗi giới hạn ở mức 2, tôi không nghĩ rằng trên phần cứng ngày nay, bất cứ ai cũng có thể chứng minh bất kỳ lợi thế rõ ràng nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.