Các hàm Postgres được khai báo với phân loại biến động VOLATILE
, STABLE
hoặcIMMUTABLE
. Dự án được biết là rất nghiêm ngặt với các nhãn này cho các chức năng tích hợp. Và với lý do chính đáng. Ví dụ nổi bật: các chỉ mục biểu thức chỉ cho phép các IMMUTABLE
hàm và chúng phải thực sự bất biến để tránh kết quả không chính xác.
Các hàm do người dùng định nghĩa vẫn miễn phí được khai báo khi chủ sở hữu chọn. Hướng dẫn tư vấn:
Để có kết quả tối ưu hóa tốt nhất, bạn nên gắn nhãn các chức năng của mình với danh mục biến động nghiêm ngặt nhất có giá trị đối với chúng.
... Và thêm một danh sách rộng lớn những thứ có thể sai với nhãn biến động không chính xác.
Tuy nhiên, có những trường hợp giả mạo bất biến có ý nghĩa. Hầu hết khi bạn biết chức năng, trên thực tế, là bất biến trong phạm vi của bạn. Thí dụ:
Tất cả các tác động có thể có về tính toàn vẹn dữ liệu sang một bên , ảnh hưởng đến hiệu suất là gì? Người ta có thể cho rằng khai báo một chức năng IMMUTABLE
chỉ có thể có lợi cho hiệu suất . Là vậy sao?
Có thể khai báo chức năng biến động IMMUTABLE
gây hại hiệu suất?
Giả sử Postgres 10 hiện tại để thu hẹp nó, nhưng tất cả các phiên bản gần đây đều đáng quan tâm.
FORCE
được cho là làm cho các chỉ mục biểu thức chấp nhận các hàm không bất biến (trong khi đánh dấu chúng là điểm tiềm năng của sự thất bại). Vâng, đó có vẻ như là một giải pháp thanh lịch hơn các hàm bao hàm bất biến.
FORCE
họ một trong hai cách. 100% các DBA PostgreSQL có kinh nghiệm nói dối để làm việc xung quanh giao diện người dùng đó với các chức năng bao bọc. Ít nhất là vớiFORCE
, chúng tôi sẽ không cần giấy gói và chúng tôi sẽ không phải nói dối về biến động fn được tuyên bố.