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

Kích thước hàng tối đa của SQL Server Vs Kích thước Varchar (Tối đa)

Trong Microsoft SQL Server, dữ liệu (bao gồm chỉ mục) được lưu trữ trong một hoặc nhiều "trang" 8k (8192 byte). Có nhiều loại trang khác nhau có thể được sử dụng để xử lý các tình huống khác nhau (ví dụ:Dữ liệu, LOB, Chỉ mục, Bản đồ phân bổ, v.v.). Mỗi trang có một tiêu đề là siêu dữ liệu về trang đó và những gì nó chứa.

Hầu hết dữ liệu được lưu trữ trong chính hàng và một hoặc nhiều trong số các hàng này lần lượt được lưu trữ trong một trang cho "dữ liệu trong hàng". Do tiêu đề hàng chiếm không gian, hàng lớn nhất có thể có (đối với dữ liệu "trong hàng") là 8060 byte.

Tuy nhiên, không phải tất cả dữ liệu đều được lưu trữ trong hàng. Đối với các kiểu dữ liệu nhất định, dữ liệu thực sự có thể được lưu trữ trên trang "dữ liệu LOB" trong khi con trỏ được để trong dữ liệu "trong hàng":

  • Các loại LOB cũ / không dùng nữa mà không ai nên sử dụng nữa (TEXT , NTEXTIMAGE ), theo mặc định, luôn lưu trữ dữ liệu của chúng trên các trang LOB và luôn sử dụng con trỏ 16 byte đến trang LOB đó.

  • Các loại LOB mới hơn (VARCHAR(MAX) , NVARCHAR(MAX) , VARBINARY(MAX)XML ), theo mặc định, sẽ cố gắng khớp dữ liệu trực tiếp trong hàng nếu nó phù hợp. Nếu không, nó sẽ lưu trữ dữ liệu trên các trang LOB và sử dụng một con trỏ 24 - 72 byte (tùy thuộc vào kích thước của dữ liệu LOB).

Đây là cách bạn có thể lưu trữ lên đến 78 GB + 4 byte (không thể quên về INT Khóa chính;-) trong một hàng:kích thước hàng tối đa sẽ nằm trong khoảng 940 byte ((39 * 24) + 4) đến 2812 byte ((39 * 72) + 4). Nhưng một lần nữa, đó chỉ là phạm vi tối đa; nếu dữ liệu trong mỗi 39 VARCHAR(MAX) trường chỉ có 10 byte, sau đó tất cả dữ liệu sẽ được lưu trữ trong hàng và kích thước hàng sẽ là 394 byte ((39 * 10) + 4).

Cho rằng bạn có quá nhiều trường có độ dài thay đổi (cho dù chúng có là TỐI ĐA hay không), cách duy nhất để ước tính kích thước của các hàng trong tương lai là có ý tưởng tốt về dữ liệu bạn sẽ lưu trữ trong bảng này. Mặc dù, một bảng có tất cả, hoặc thậm chí hầu hết, các kiểu dữ liệu MAX ngụ ý rằng không ai thực sự có bất kỳ ý tưởng nào sẽ được lưu trữ trong bảng này.

Cùng với những dòng đó, cần phải chỉ ra rằng đây là một bảng được mô hình hóa khủng khiếp / việc sử dụng khủng khiếp các trường kiểu dữ liệu MAX và nên được cấu trúc lại.

Để biết thêm chi tiết về cách các trang dữ liệu được cấu trúc, vui lòng xem câu trả lời của tôi cho câu hỏi DBA.StackExchange sau:

SUM trong số DATALENGTHs không khớp với kích thước bảng từ sys.allocation_units



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thực thi biểu thức toán học và đặt giá trị thành biến trong SQL

  2. Chèn 2 triệu hàng vào SQL Server nhanh chóng

  3. Câu lệnh SQL Nhiều LIKE

  4. Thực thi sp_msforeachdb trong ứng dụng Java

  5. Làm cách nào để tăng tốc DbSet.Add ()?