Một ví dụ mà điều này có thể tạo ra sự khác biệt là nó có thể ngăn tối ưu hóa hiệu suất tránh việc thêm thông tin lập phiên bản hàng vào các bảng có sau trình kích hoạt.
Điều này được Paul White đề cập tại đây
Kích thước thực của dữ liệu được lưu trữ là không quan trọng - chính kích thước tiềm năng mới là vấn đề quan trọng.
Tương tự, nếu sử dụng các bảng được tối ưu hóa bộ nhớ kể từ năm 2016, có thể sử dụng cột LOB hoặc kết hợp độ rộng cột có thể vượt quá giới hạn inrow nhưng bị phạt.
Các cột (Tối đa) luôn được lưu trữ ngoài hàng. Đối với các cột khác, nếu kích thước hàng dữ liệu trong định nghĩa bảng có thể vượt quá 8.060 byte, SQL Server đẩy (các) cột có độ dài thay đổi lớn nhất ra ngoài hàng. Một lần nữa, nó không phụ thuộc vào lượng dữ liệu bạn lưu trữ ở đó.
Điều này có thể có tác động tiêu cực lớn đến việc tiêu thụ và hoạt động của bộ nhớ
Một trường hợp khác mà việc khai báo quá nhiều độ rộng cột có thể tạo ra sự khác biệt lớn là liệu bảng có được xử lý bằng SSIS hay không. Bộ nhớ được cấp phát cho các cột có độ dài thay đổi (không phải BLOB) được cố định cho mỗi hàng trong cây thực thi và theo độ dài tối đa được khai báo của cột, điều này có thể dẫn đến việc sử dụng bộ đệm bộ nhớ không hiệu quả (ví dụ). Trong khi nhà phát triển gói SSIS có thể khai báo kích thước cột nhỏ hơn nguồn thì phân tích này tốt nhất nên được thực hiện trước và thực thi ở đó.
Trở lại với chính công cụ SQL Server, một trường hợp tương tự là khi tính toán bộ nhớ cấp để phân bổ cho SORT
hoạt động SQL Server giả định rằng varchar(x)
trung bình các cột sẽ tiêu thụ x/2
byte.
Nếu hầu hết varchar
của bạn các cột đầy hơn điều này có thể dẫn đến sort
các hoạt động tràn sang tempdb
.
Trong trường hợp của bạn nếu varchar
của bạn các cột được khai báo là 8000
byte nhưng thực sự có nội dung ít hơn nhiều so với việc truy vấn của bạn sẽ được cấp phát bộ nhớ mà nó không yêu cầu, rõ ràng là không hiệu quả và có thể dẫn đến việc chờ cấp bộ nhớ.
Điều này được đề cập trong Phần 2 của Webcast 1 của Hội thảo SQL có thể tải xuống từ đây hoặc xem bên dưới.
use tempdb;
CREATE TABLE T(
id INT IDENTITY(1,1) PRIMARY KEY,
number int,
name8000 VARCHAR(8000),
name500 VARCHAR(500))
INSERT INTO T
(number,name8000,name500)
SELECT number, name, name /*<--Same contents in both cols*/
FROM master..spt_values
SELECT id,name500
FROM T
ORDER BY number
SELECT id,name8000
FROM T
ORDER BY number