Các cột trống có chiếm không gian trong một bảng không?


20

Tôi có bảng giữ từ thông tin rất cơ bản. Chỉ cần một tiêu đề và một vài trường ngày. Có một trường được gọi là các bình luận là varchar (4000) Hầu hết thời gian chúng tôi để trống, nhưng một số lần sẽ nhập một lượng lớn dữ liệu ở đây. Đây có phải là một thiết kế thực sự xấu? Hay đây chỉ là một chút không hiệu quả?

Tôi cho rằng việc tạo một bảng riêng cho cột này sẽ tốt hơn.

lưu ý: đây là máy chủ sql 2008

nhập mô tả hình ảnh ở đây


Cảm ơn phản hồi của bạn mọi người! Tôi quyết định giữ cho nó đơn giản và giữ cột trong bảng và không đặt nó vào một bảng khác. Tuy nhiên, tôi đã sử dụng tính năng SPARSE trong SQL 2008 để trường không sử dụng bất kỳ khoảng trắng nào.

2
Chỉ tò mò, "hầu hết thời gian" là gì? Tổng cộng có bao nhiêu hàng và bao nhiêu phần trăm có giá trị ở đây? Chỉ tự hỏi liệu bạn có dự định thực hiện bất kỳ so sánh không gian / hiệu suất nào bằng cách sử dụng SPARSEvà không sử dụng SPARSE...
Aaron Bertrand

Câu trả lời:


9

Để có hiệu suất dễ dự đoán hơn (và để tránh có sự thay đổi cao của các hàng trên mỗi trang), tôi sẽ nghiêng về việc lưu trữ dữ liệu này trong một bảng có liên quan - đặc biệt là nếu nó chỉ chiếm một tỷ lệ nhỏ thời gian và đặc biệt là nếu nó chỉ được truy xuất trong một số truy vấn Các hàng nơi giá trị này NULLđóng góp vào không gian, nhưng điều này là tối thiểu. Quan trọng hơn sẽ là làm thế nào một trang chỉ có thể phù hợp với hai hàng và trang tiếp theo có thể phù hợp với 500 hàng - điều này thực sự có thể ảnh hưởng đến thống kê và bạn có thể tách ra điều này để nó được lưu trữ riêng biệt và không ảnh hưởng đến tất cả các hoạt động của bạn trên bảng lõi.


12

Nó chiếm không gian tối thiểu khi không sử dụng

  • một bit trong bitmap NULL
  • hai byte cho chiều dài (sẽ bằng 0 khi NULL)

Chi phí tối thiểu và tối ưu hóa sẽ sớm.

Cho đến khi bạn biết bạn có một vấn đề, chỉ cần giữ nó trong một bảng. Bạn phá vỡ KISS bằng cách giới thiệu các phép nối ngoài và thêm một chi phí trong việc truy vấn dữ liệu.

Xem /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 để biết thêm


10

Tôi nghĩ rằng một bảng riêng sẽ tốt hơn để cải thiện mật độ trang và giảm sự phân mảnh, đặc biệt nếu bạn không luôn điền vào trường đó.

  • Một trang dữ liệu chứa khoảng 8000 byte
  • Bạn có một số hàng có 100 byte và một số hàng có hơn 4000 byte
  • Những hàng dài đó sẽ tự ở trên một trang và phần còn lại của trang bị "lãng phí" không gian mà DB của bạn chiếm nhưng có thể sẽ không bao giờ giữ dữ liệu
  • Nếu bạn thêm dữ liệu vào trường dài đó cho một bản ghi trên một trang gần như đầy đủ, nó có thể sẽ tràn ngập trang và dẫn đến một con trỏ đến trang với phần còn lại của bản ghi

Tất cả các trang trống và con trỏ dẫn đến hiệu suất kém. Bình thường hóa lĩnh vực đó nếu bạn có thể.


4

Câu hỏi này trông rất giống nhau: các cột trống thừa có ảnh hưởng đến kích thước bảng sql đáng kể không?

Có vẻ như câu trả lời là có, nó chiếm không gian, nhưng có một thuật toán nén cho các cột có nhiều giá trị null.

Theo như thiết kế, tôi nghĩ rằng có một bảng bên ngoài được liên kết với điều này sẽ là một thiết kế sạch hơn. Việc có một cột có giá trị null thường xuyên sẽ khiến người dùng cơ sở dữ liệu khó khăn hơn vì họ có thể vô tình sử dụng giá trị null nếu không cẩn thận. Do đó, mã sử dụng cơ sở dữ liệu sẽ cần phải kiểm tra lỗi và nó trở nên xấu đi từ đó.


2
Để rõ ràng, thuật toán nén chỉ áp dụng cho các cột được xác định rõ ràng là SPARSE, không chỉ là "các cột có nhiều giá trị null".
Aaron Bertrand

2

Bạn sẽ ổn thôi - nó đã là một cột varchar, vì vậy nó chỉ sử dụng không gian khi nó chứa dữ liệu. Nếu bạn có nhiều cột có kích thước cố định không thể rỗng như int, bạn có thể gặp vấn đề về sử dụng không gian.

Theo như đặt nó vào một bảng khác, tôi sẽ không bận tâm. Bạn cũng có thể xem xét bằng cách sử dụng varchar (max) và các tùy chọn vào / ra của hàng. Một lần nữa, có lẽ là sớm.


1
Tối ưu hóa sớm thường có thể là một vấn đề thực sự, nhưng điều đó phụ thuộc vào chi phí tái cấu trúc sau này. Nếu bạn biết ngày hôm nay chỉ có 1% số hàng của bạn sẽ có dữ liệu trong cột này và bạn hy vọng bảng sẽ phát triển lớn theo thời gian, thì giá trị nào trong việc duy trì dữ liệu trong bảng hiện tại chỉ chịu hậu quả khi bạn chia tỷ lệ? Tôi là tất cả để tránh tối ưu hóa sớm, nhưng có một điểm khi tôi cân nhắc hiệu quả lâu dài của việc đó.
Aaron Bertrand

@Aaron Bertrand Đồng ý. Mọi người đặt câu hỏi về hiệu suất ở đây và thật dễ dàng để cho rằng họ có thể có một ứng dụng có hàng triệu hàng và họ cần sử dụng mọi vũ khí trong bộ công cụ và ghi nhớ tất cả những điều đó. Mặt khác, đôi khi người dùng dường như đang bắt đầu một lộ trình học tập và thật khó để yêu cầu họ dành thời gian cho điều gì đó có lẽ nên thấp hơn trong các ưu tiên của họ. Ngoài ra, với varchar (max), bạn có thể bật công tắc một cách hiệu quả để bắt đầu lưu trữ ngoài hàng. Tôi nghĩ rằng câu trả lời thực sự ở đây là "Bạn chưa thực sự cung cấp cho chúng tôi đủ thông tin để đưa ra câu trả lời dứt khoát".
Cade Roux
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.