PostgreSQL: Bất biến, dễ bay hơi, ổn định


11

Tôi không rõ về ý nghĩa thực sự trong các định nghĩa cho các hàm IMMUTABLE, VOLATILE và STABLE.

Tôi đọc tài liệu, cụ thể là các định nghĩa của từng.

IMMUTABLE chỉ ra rằng hàm không thể sửa đổi cơ sở dữ liệu và luôn trả về cùng kết quả khi được cung cấp cùng giá trị đối số ; nghĩa là, nó không thực hiện tra cứu cơ sở dữ liệu hoặc sử dụng thông tin không có mặt trực tiếp trong danh sách đối số của nó. Nếu tùy chọn này được đưa ra, bất kỳ lệnh gọi nào của hàm với các đối số không đổi có thể được thay thế ngay lập tức bằng giá trị hàm.

STABLE chỉ ra rằng hàm không thể sửa đổi cơ sở dữ liệu và trong một lần quét bảng, nó sẽ trả về cùng một kết quả cho cùng các giá trị đối số , nhưng kết quả của nó có thể thay đổi trên các câu lệnh SQL. Đây là lựa chọn phù hợp cho các hàm có kết quả phụ thuộc vào tra cứu cơ sở dữ liệu, biến tham số (như múi giờ hiện tại), v.v. (Không phù hợp với trình kích hoạt SAU muốn truy vấn các hàng được sửa đổi bởi lệnh hiện tại.) Cũng lưu ý rằng Dòng chức năng current_timestamp đủ điều kiện là ổn định, vì giá trị của chúng không thay đổi trong một giao dịch.

VOLATILE chỉ ra rằng giá trị hàm có thể thay đổi ngay cả trong một lần quét bảng, do đó không thể tối ưu hóa. Tương đối ít chức năng cơ sở dữ liệu là không ổn định theo nghĩa này; một số ví dụ là ngẫu nhiên (), currentval (), timeofday (). Nhưng lưu ý rằng bất kỳ chức năng nào có tác dụng phụ đều phải được phân loại dễ bay hơi, ngay cả khi kết quả của nó hoàn toàn có thể dự đoán được, để ngăn các cuộc gọi không được tối ưu hóa; một ví dụ là setval ().

Sự nhầm lẫn của tôi đi kèm với các điều kiện để bất biến và ổn định chức năng LUÔN hoặc luôn trả về kết quả tương tự cho các đối số tương tự.

Định nghĩa IMMUTABLE nói rằng hàm không tra cứu cơ sở dữ liệu hoặc sử dụng thông tin không có mặt trực tiếp trong danh sách đối số của nó. Vì vậy, với tôi, điều đó có nghĩa là các chức năng như vậy được sử dụng để thao tác dữ liệu do khách hàng cung cấp và không nên có các câu lệnh CHỌN ... mặc dù điều đó nghe có vẻ hơi kỳ lạ đối với tôi.

Với STABLE, định nghĩa tương tự ở chỗ nó nói rằng nó sẽ luôn trả về cùng một kết quả. Vì vậy, với tôi, điều đó có nghĩa là mỗi khi hàm được gọi với cùng một đối số, nó sẽ trả về cùng một kết quả (cùng một hàng chính xác, mỗi lần duy nhất).

Vì vậy, với tôi ... điều đó có nghĩa là bất kỳ chức năng nào thực hiện CHỌN trên bảng hoặc bảng có thể được cập nhật, chỉ nên biến động.

Nhưng, một lần nữa ... điều đó không đúng với tôi.

Đưa điều này trở lại trường hợp sử dụng của tôi, tôi đang viết các hàm thực hiện các câu lệnh CHỌN với nhiều THAM GIA trên các bảng liên tục được thêm vào, do đó, các lệnh gọi hàm sẽ được trả về các kết quả khác nhau mỗi lần nó được gọi, ngay cả với cùng một đối số .

Vì vậy, điều đó có nghĩa là các chức năng của tôi phải là TỰ ĐỘNG? Mặc dù tài liệu chỉ ra tương đối ít chức năng cơ sở dữ liệu có biến động theo nghĩa này ?

Cảm ơn bạn!

Câu trả lời:


15

IMMUTABLEphải là một hàm thuần túy, có kết quả chỉ phụ thuộc vào đầu vào của nó. Đây là một yêu cầu rất nghiêm ngặt; họ không thể gọi các hàm không thay đổi khác, họ không thể truy cập các bảng, họ không thể truy cập giá trị của các thuộc tính cấu hình, v.v.

STABLEcó thể sử dụng bất kỳ đầu vào nào là chính chúng STABLE: khác STABLEhoặc IMMUTABLEhàm và SELECTtruy vấn của bảng. An toàn cho các bảng truy vấn vì chế độ xem của các bảng đó sẽ không thay đổi trong ảnh chụp nhanh hiện tại của truy vấn. Bạn có thể truy cập các giá trị GUC ( current_setting(...)) miễn là bạn biết chúng cũng sẽ không được gán trong câu lệnh hiện tại.

VOLATILE chức năng là tất cả mọi thứ không phù hợp với ở trên:

  • Bất cứ điều gì với tác dụng phụ
  • Bất cứ điều gì viết
  • Bất cứ điều gì truy vấn dữ liệu ngoài không được quản lý bởi ảnh chụp nhanh PostgreSQL
  • ...

Nói chung, chỉ để lại mọi thứ VOLATILEtrừ khi bạn có lý do chính đáng để không.

Lý do chính để sử dụng IMMUTABLElà khi viết các hàm được sử dụng như một phần của biểu thức chỉ mục.


1
"họ không thể truy cập các bảng." Trong công bằng, họ có thể và họ làm. Tôi nghĩ một quy tắc chung hơn là các bảng không được phép thay đổi một cách có ý nghĩa nếu không khởi động lại cơ sở dữ liệu.
Evan Carroll

Nếu STABLE cho phép truy cập bảng, có bất kỳ tối ưu hóa nào trên / trên TÌNH TRẠNG ... không?
Brooks

Đừng nhớ ra khỏi đầu tôi, sẽ phải kiểm tra tài liệu / mã.
Craig Ringer

4

Đối với ỔN ĐỊNH, phần bạn cần in đậm là 'kết quả có thể thay đổi trên các câu lệnh SQL'

Những điều NGAY LẬP TỨC không nên thay đổi bao giờ. Ngay cả khi bạn khởi động lại của bạn máy chủ cơ sở dữ liệu, chạy yum update(nhưng tất nhiên có thể có lỗi!), Thay đổi cấu hình của bạn (như datestyle, timezone, default_text_search_config, extra_float_digits, vv), hoặc thay thế phần cứng máy chủ của bạn hoàn toàn (của kiến trúc tương tự như các phần cứng cũ, vì vậy các tệp nhị phân vẫn tương thích).

Các hàm bạn mô tả âm thanh giống như chúng ỔN ĐỊNH, bởi vì trong một câu lệnh SQL, chúng sẽ thực hiện các truy vấn của chúng bằng cách sử dụng cùng một ảnh chụp nhanh như truy vấn bên ngoài và do đó, bất kỳ thay đổi đồng thời nào bạn thực hiện đối với các bảng khác sẽ không hiển thị. Bây giờ, nếu các chức năng của bạn đã mở một kết nối mới đến máy chủ và chạy các truy vấn của chúng trong kết nối độc lập đó, điều đó sẽ khiến chức năng đó biến động, bởi vì chúng sẽ sử dụng các ảnh chụp nhanh khác nhau.


Tôi tin rằng tôi hiểu các điều kiện tiên quyết cho IMMUTABLE (không có gì có thể thay đổi .... bao giờ, giữa các truy vấn, kết nối, khởi động lại, phá hủy và tái cấu trúc hành tinh, NGAY CẢ NẾU cơ sở dữ liệu được sửa đổi) và VOLATILE (chức năng nhảy ra ngoài bối cảnh trong mà nó được gọi là). Đúng không? Vì vậy, sau đó nó xuất hiện STABLE đơn giản có nghĩa là chức năng không sửa đổi cơ sở dữ liệu và không truy cập cơ sở dữ liệu bên ngoài bối cảnh của nó? Định nghĩa của ỔN ĐỊNH cảm thấy như nó CÁCH phức tạp hơn thực tế cần phải ... Hoặc tôi sẽ bỏ đi thứ gì đó?
Brooks

PostgreSQL thực sự có một số vấn đề xung quanh IMMUTABLEvà đối chiếu. Nó tin tưởng rằng glibc(hoặc, trong PG mới hơn, iconv) sẽ không thay đổi định nghĩa đối chiếu. Trong thực tế, họ làm và không cung cấp cách nào để phát hiện những thay đổi đó. Nó có thể dẫn đến tham nhũng chỉ mục im lặng :(. Đây hầu như là một vấn đề khi sao chép giữa các phiên bản HĐH khác nhau, v.v.
Craig Ringer
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.