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 chặn việc tối ưu hóa hiệu suất tránh thêm thông tin lập phiên bản hàng vào bảng có sau trình kích hoạt.
Điều này được bao phủ bởi SQL Kiwi tại đây
Kích thước thực của dữ liệu được lưu trữ là không quan trọng - đó là 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 khỏ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à nếu bảng sẽ được xử lý bằng SSIS. 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ác 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 ở đó.
Quay lại bản thân 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 các SORT
hoạt động, SQL Server giả định rằngvarchar(x)
các cột sẽ tiêu thụ trung bình các x/2
byte.
Nếu hầu hết các varchar
cột của bạn đầy hơn mức đó, điều này có thể dẫn đến các sort
hoạt động tràn sangtempdb
.
Trong trường hợp của bạn nếu các varchar
cột của bạn được khai báo là8000
byte nhưng thực sự có nội dung ít hơn nhiều thì truy vấn của bạn sẽ được cấp phát bộ nhớ mà nó không yêu cầu, điều này 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