Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

37.6. Các loại biến động chức soi kèo bóng đá truoctran

Mỗi chức soi kèo bóng đá truoctran đều cósoi kèo bóng đá truoctranPhân loại, với các khả soi kèo bóng đá truoctran là11074_11084, ổn địnhhoặcbất soi kèo bóng đá truoctran. là mặc định nếuTạo chức soi kèo bóng đá truoctranLệnh không chỉ định danh mục. Danh mục soi kèo bóng đá truoctran là một lời hứa cho trình tối ưu hóa về hành vi của hàm:

  • AHàm có thể làm bất cứ điều gì, bao gồm sửa đổi cơ sở dữ liệu. Nó có thể trả về các kết quả khác nhau cho các cuộc gọi liên tiếp với cùng một đối số. Trình tối ưu hóa không đưa ra giả định về hành vi của các chức soi kèo bóng đá truoctran như vậy. Một truy vấn sử dụng hàm dễ bay hơi sẽ đánh giá lại hàm ở mỗi hàng khi cần giá trị của nó.

  • Aổn địnhHàm không thể sửa đổi cơ sở dữ liệu và được đảm bảo trả về các kết quả tương tự với các đối số tương tự cho tất cả các hàng trong một câu lệnh. Danh mục này cho phép trình tối ưu hóa tối ưu hóa nhiều cuộc gọi của hàm thành một cuộc gọi. Cụ thể, việc sử dụng một biểu thức chứa một chức soi kèo bóng đá truoctran như vậy là an toàn trong điều kiện quét chỉ mục. .chức soi kèo bóng đá truoctran trong điều kiện quét chỉ mục.)

  • ANImmutable12634_12889Chọn ... trong đó x = 2 + 2Có thể đơn giản hóa khi nhìn đếnChọn ... trong đó x = 4, vì hàm bên dưới toán tử bổ sung số nguyên được đánh dấubất soi kèo bóng đá truoctran.

Để có kết quả tối ưu hóa tốt nhất, bạn nên dán nhãn các chức soi kèo bóng đá truoctran 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.

Bất kỳ chức soi kèo bóng đá truoctran nào có tác dụng phụphảiđược dán nhãnDisrily, do đó, các cuộc gọi đến nó không thể được tối ưu hóa. Ngay cả một chức soi kèo bóng đá truoctran không có tác dụng phụ cũng cần được dán nhãnDisrileNếu giá trị của nó có thể thay đổi trong một truy vấn duy nhất; Một số ví dụ làngẫu nhiên (), currval (), Timeofday ().

Một ví dụ quan trọng khác làcurrent_timestampGia đình chức soi kèo bóng đá truoctran đủ điều kiện làổn định, vì giá trị của chúng không thay đổi trong giao dịch.

13972_14020ổn địnhbất soi kèo bóng đá truoctranDanh mục khi xem xét các truy vấn tương tác đơn giản được lên kế hoạch và thực hiện ngay lập tức: Không quan trọng nhiều cho dù một chức soi kèo bóng đá truoctran được thực thi một lần trong quá trình lập kế hoạch hoặc một lần trong quá trình khởi động thực thi truy vấn. Nhưng có một sự khác biệt lớn nếu kế hoạch được lưu và tái sử dụng sau đó. Ghi nhãn một chức soi kèo bóng đá truoctranbất soi kèo bóng đá truoctranKhi nó thực sự không cho phép nó được gấp sớm thành một hằng số trong quá trình lập kế hoạch, dẫn đến giá trị cũ được sử dụng lại trong quá trình sử dụng tiếp theo của kế hoạch. Đây là một mối nguy hiểm khi sử dụng các câu lệnh đã chuẩn bị hoặc khi sử dụng các ngôn ngữ chức soi kèo bóng đá truoctran mà các kế hoạch bộ nhớ cache (chẳng hạn nhưPL/PGSQL).

Đối với các hàm được viết bằng SQL hoặc trong bất kỳ ngôn ngữ thủ tục tiêu chuẩn nào, có một thuộc tính quan trọng thứ hai được xác định bởi danh mục biến động, cụ thể là khả soi kèo bóng đá truoctran hiển thị của bất kỳ thay đổi dữ liệu nào được thực hiện bởi lệnh SQL đang gọi hàm. MỘTchức soi kèo bóng đá truoctran sẽ thấy những thay đổi đó, Aổn địnhhoặcImmutableHàm sẽ không. Hành vi này được thực hiện bằng cách sử dụng hành vi nhanh của MVCC (xemChương 13):Ổn địnhbất soi kèo bóng đá truoctranCác chức soi kèo bóng đá truoctran Sử dụng ảnh chụp nhanh được thiết lập khi bắt đầu truy vấn gọi điện, trong khiDisrilyCác chức soi kèo bóng đá truoctran có được một ảnh chụp nhanh mới khi bắt đầu mỗi truy vấn mà họ thực hiện.

Lưu ý

15709_15841

Vì hành vi nhanh này, một hàm chỉ chứaChọnCác lệnh có thể được đánh dấu một cách an toànổn định, ngay cả khi nó chọn từ các bảng có thể trải qua các sửa đổi bằng các truy vấn đồng thời.PostgreSQLSẽ thực thi tất cả các lệnh của Aổn địnhHàm sử dụng ảnh chụp nhanh được thiết lập cho truy vấn gọi điện và do đó nó sẽ thấy một chế độ xem cố định của cơ sở dữ liệu trong suốt truy vấn đó.

Hành vi nhanh tương tự được sử dụng choChọnlệnh trongbất soi kèo bóng đá truoctran16501_16579Immutablechức soi kèo bóng đá truoctran, vì tính bất biến sẽ bị phá vỡ nếu nội dung bảng thay đổi. Tuy nhiên,POSTGRESQLKhông thực thi rằng bạn không làm điều đó.

Một lỗi phổ soi kèo bóng đá truoctran là dán nhãn hàmbất soi kèo bóng đá truoctranKhi kết quả của nó phụ thuộc vào tham số cấu hình. Ví dụ: một hàm thao tác với dấu thời gian có thể có kết quả phụ thuộc vàotimezoneCài đặt. Để an toàn, các chức soi kèo bóng đá truoctran như vậy nên được dán nhãnỔn địnhThay vào đó.

Lưu ý

PostgreSQLYêu cầu điều đóổn địnhbất soi kèo bóng đá truoctranCác chức soi kèo bóng đá truoctran không chứa các lệnh SQL khác ngoàiChọnĐể ngăn chặn sửa đổi dữ liệu. (Đây không phải là một bài kiểm tra hoàn toàn chống đạn, vì các chức soi kèo bóng đá truoctran như vậy vẫn có thể gọiDisrileCác chức soi kèo bóng đá truoctran sửa đổi cơ sở dữ liệu. Nếu bạn làm điều đó, bạn sẽ thấy rằngổn địnhhoặcbất soi kèo bóng đá truoctran17783_17905