2009-08-03 25 views

Trả lời

12

Nó luôn luôn là một tốt lý tưởng để giữ cho cột không bị NULL nếu bạn có thể tránh được nó, bởi vì ngữ nghĩa của việc sử dụng rất lộn xộn; xem What is the deal with NULLs? để có một cuộc thảo luận tốt về cách những người đó có thể khiến bạn gặp rắc rối.

Trong phiên bản PostgreSQL tối đa 8.2, phần mềm không biết cách so sánh trên chỉ mục kiểu phổ biến nhất (b-tree) theo cách sẽ bao gồm việc tìm giá trị NULL trong chúng. Trong bit liên quan của documentation on index types, bạn có thể thấy rằng được mô tả là "nhưng lưu ý rằng IS NULL không tương đương với = và không thể lập chỉ mục". Nhược điểm hiệu quả của việc này là nếu bạn chỉ định một truy vấn yêu cầu bao gồm các giá trị NULL, trình lập kế hoạch có thể không đáp ứng được bằng cách sử dụng chỉ mục rõ ràng cho trường hợp đó. Ví dụ đơn giản, nếu bạn có câu lệnh ORDER BY có thể được tăng tốc với chỉ mục, nhưng truy vấn của bạn cũng cần phải trả về giá trị NULL, trình tối ưu hóa không thể sử dụng chỉ mục đó vì kết quả sẽ thiếu bất kỳ dữ liệu NULL nào - và do đó không đầy đủ và vô ích. Trình tối ưu hóa biết điều này và thay vào đó sẽ thực hiện quét bảng không được lập chỉ mục, điều này có thể rất tốn kém.

PostgreSQL improved this in 8.3, "điều kiện IS NULL trên cột chỉ mục có thể được sử dụng với chỉ mục B-cây". Vì vậy, các tình huống mà bạn có thể được đốt cháy bằng cách cố gắng để chỉ mục một cái gì đó với giá trị NULL đã được giảm. Nhưng vì ngữ nghĩa NULL vẫn thực sự đau đớn và bạn có thể chạy vào một tình huống mà ngay cả trình hoạch định 8.3 không làm những gì bạn mong đợi vì chúng, bạn vẫn nên sử dụng NOT NULL bất cứ khi nào có thể để giảm cơ hội chạy vào truy vấn được tối ưu hóa kém .

+0

bình luận tuyệt vời ... Tôi không biết rằng mối quan hệ giữa không null và lập chỉ mục. Cảm ơn anh chàng! –

2

Không, miễn là bạn không thực sự lưu trữ NULL trong bảng, các chỉ mục sẽ trông giống hệt nhau (và hiệu quả không kém).

Thiết cột NOT NULL có rất nhiều lợi thế khác mặc dù, vì vậy bạn nên luôn đặt nó rằng khi bạn không có kế hoạch để lưu trữ NULLs trong đó :-)

15

Đặt NOT NULL không ảnh hưởng đến hiệu suất. Một vài chu kỳ kiểm tra - không liên quan.

Nhưng bạn có thể cải thiện hiệu suất bằng cách thực sự sử dụng NULL thay vì giá trị giả. Tùy thuộc vào loại dữ liệu, bạn có thể tiết kiệm rất nhiều không gian đĩa và RAM, nhờ đó tăng tốc độ .. mọi thứ.

Bản đồ bit trống chỉ được phân bổ nếu có bất kỳ giá trị NULL nào trong hàng . Một bit cho mỗi cột mỗi trong hàng (NULL hoặc không). Đối với các bảng lên đến 8 cột, bitmap rỗng hoàn toàn miễn phí, sử dụng một byte dự phòng giữa dữ liệu tiêu đề và dữ liệu hàng. Sau đó, không gian được phân bổ theo bội số của MAXALIGN (thường là 8 byte, bao gồm 64 cột). Sự khác biệt bị mất để đệm. Vì vậy, bạn trả giá đầy đủ (thấp!) Cho giá trị NULL đầu tiên trong mỗi hàng. Giá trị NULL bổ sung chỉ có thể tiết kiệm không gian.

Yêu cầu lưu trữ tối thiểu đối với bất kỳ giá trị null là 1 byte (boolean, "char", ...) hoặc thường nhiều hơn, cộng với (có thể) đệm cho sự liên kết. Đọc trên data types hoặc kiểm tra chi tiết đẫm máu trong bảng hệ thống pg_type.

thêm về bộ nhớ null:

+0

Bạn có ý nghĩa gì với "một vài chu kỳ kiểm tra"? – ma11hew28

+2

@MattDiPasquale: Postgres cần thực thi ràng buộc và tăng ngoại lệ nếu nó không được đáp ứng. Kể từ khi thử nghiệm cho NULL là rất đơn giản, chi phí là không đáng kể. –

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