Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

varchar (500) có lợi thế hơn so với varchar (8000)?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SYSDATETIMEOFFSET () Ví dụ trong SQL Server (T-SQL)

  2. TSQL:Tạo một dạng xem truy cập nhiều cơ sở dữ liệu

  3. Cách vô hiệu hóa tất cả các ràng buộc về CHECK &khóa ngoại trong cơ sở dữ liệu trong SQL Server (Ví dụ T-SQL)

  4. Các chỉ mục của SQL Server:Các yêu cầu chính, tác động đến hiệu suất và những cân nhắc

  5. Truy vấn PIVOT trên các bản ghi riêng biệt