2011-02-07 32 views
5

Trong khi nó dễ dàng được ghi nhận rằng NULL chỉ mất 1 bit trong tiêu đề tuple postgresql cho hàng, số lượng không gian nào mà NULL mất trong INDEX của cột rỗng (không phải bộ tuple, nhưng chỉ mục)? Có cùng 1 bit trong chỉ mục như trong bộ dữ liệu hay là kích thước kiểu dữ liệu cột đầy đủ (EG: số nguyên = 4 byte)? Bối cảnh cho câu hỏi là tôi có một bảng postgresql có 3 cột tham chiếu (EG: foo_id, bar_id và baz_id) và cho bất kỳ hàng nào, chỉ một trong các cột đó sẽ có giá trị (2 cột còn lại sẽ có giá trị). là NULL). Tuy nhiên, tôi cần tất cả 3 cột để được lập chỉ mục. Giả sử rằng mỗi cột là một số nguyên (4 byte trong postgresql), mỗi hàng phải chiếm 4 byte (cho cột không null) cộng với 2 bit (cho 2 cột trống). Tuy nhiên, nếu tôi thêm chỉ mục cho tất cả 3 cột, dung lượng lưu trữ cho 3 chỉ mục sẽ là 12 byte (nếu chỉ mục chiếm toàn bộ 4 byte cho giá trị null) hoặc 4 byte + 2 bit giống như trong tuple chính nó.Do NULLs chiếm không gian trong chỉ mục postgresql?

+0

Vâng, một cách mà bạn có thể tự mình trả lời một phần - chúng không thể được đại diện bởi (chỉ) cùng một số byte theo yêu cầu của kiểu dữ liệu. Trong ví dụ int của bạn, mọi kết hợp có thể có của 4 byte đại diện cho một giá trị int hợp lệ - vì vậy không có cách nào một null có thể được mã hóa trong bốn byte đó. –

Trả lời

1

Các thói quen truy cập btree sử dụng PageGetItem() để lấy khóa thực tế từ chỉ mục. Vì vậy, tôi tin rằng các trang chỉ mục btree sử dụng cùng một lược đồ lưu trữ như các trang heap thông thường (bao gồm cả mặt nạ vô hiệu), chúng chỉ có thông tin điều hướng bổ sung trong vùng "đặc biệt" của trang để giữ tất cả các con trỏ btree.

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