2012-04-04 35 views
5

Cho một bảng lớn (10-100 triệu hàng) cách tốt nhất để thêm một số cột thừa (chưa lập chỉ mục) vào nó là gì?PostgreSQL: hiệu suất tác động của các cột phụ

  1. Chỉ cần thêm các cột.
  2. Tạo một bảng riêng cho mỗi cột phụ và sử dụng các phép nối khi bạn muốn truy cập các giá trị bổ sung.

Câu trả lời có thay đổi tùy thuộc vào việc các cột thừa dày đặc (chủ yếu là không rỗng) hoặc thưa thớt (chủ yếu là không)?

Trả lời

13

Một cột có giá trị NULL có thể được thêm vào một hàng mà không có bất kỳ thay đổi nào đối với phần còn lại của trang dữ liệu in most cases. Chỉ một bit phải được đặt trong bitmap NULL bitmask. Vì vậy, có, một cột thưa thớt là rẻ hơn nhiều để thêm vào trong hầu hết các trường hợp.

Nên tạo bảng riêng biệt 1: 1 cho các cột bổ sung phụ thuộc rất nhiều vào trường hợp sử dụng. Nó thường đắt hơn. Đối với người mới bắt đầu, có một chi phí là 28 byte (tiêu đề heaptuple cộng với con trỏ mục) mỗi hàng và một số chi phí bổ sung cho mỗi bảng. Nó cũng đắt hơn nhiều đối với JOIN hàng trong một truy vấn hơn là đọc chúng trong một phần. Và bạn cần thêm cột khóa chính/khóa ngoài cùng với chỉ mục trên đó. Chia tách có thể là một ý tưởng hay nếu bạn không cần các cột bổ sung trong hầu hết các truy vấn. Chủ yếu nó là một ý tưởng tồi.

Thêm cột nhanh trong PostgreSQL. Cập nhật các giá trị trong cột là những gì có thể tốn kém, bởi vì mỗi UPDATE viết một hàng mới (do mô hình MVCC). Do đó, bạn nên cập nhật nhiều cột cùng một lúc.

Database page layout in the manual.

Làm thế nào để tính toán kích thước hàng:

+0

'có một overhead của 28 byte (tiêu đề heaptuple cộng con trỏ item) cho mỗi hàng và một số thêm chi phí cho mỗi bảng 'Chỉ cần để xác nhận, điều này có nghĩa là một bảng thông qua với ba số nguyên 4 byte (khóa chính + 2 fo khóa trị vì) sẽ mất 28 + 12 byte mỗi hàng? – dtgq

+1

@DavidTan: Trên thực tế, tổng cộng 44 byte mỗi hàng. 24 + 4 + 3 * 4 + 4 byte của liên kết đệm. Tôi đã thêm các liên kết để giải thích chi tiết hơn ở trên. –

Các vấn đề liên quan