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ế.

35.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à10612_10622, Ổ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 một 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:

  • ADisrilyHà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ở lại kết quả khác nhau về các cuộc gọi liên tiếp với cùng lập luận. Trình tối ưu hóa không đưa ra giả định nào 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 chức soi kèo bóng đá truoctran dễ bay hơi sẽ đánh giá lại hàm ở mỗi hàng nơi giá trị của nó cần thiết.

  • A11419_11427chức soi kèo bóng đá truoctran không thể sửa đổi cơ sở dữ liệu và được đảm bảo sẽ trả về các kết quả tương tự đưa ra các đối số tương tự cho tất cả các hàng trong một tuyên bố. 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. TRONG đặc biệt, là an toàn khi sử dụng một biểu thức chứa một chức soi kèo bóng đá truoctran trong một điều kiện quét chỉ mục. (Kể từ khi quét chỉ mục sẽ đánh giá giá trị so sánh chỉ một lần, không một lần tại mỗi hàng, nó không hợp lệ khi sử dụngchức soi kèo bóng đá truoctran trong quá trình quét chỉ mục tình trạng.)

  • ANbất soi kèo bóng đá truoctranHàm không thể Sửa đổi cơ sở dữ liệu và được đảm bảo trả về cùng một Kết quả đưa ra những lập luận tương tự mãi mãi. Thể loại này cho phép trình tối ưu hóa đánh giá trước chức soi kèo bóng đá truoctran khi Truy vấn gọi nó với các đối số liên tục. Ví dụ: một truy vấn giốngChọn ... trong đó x = 2 + 2Có thể được đơn giản hóa trên tầm nhìnChọn ... Trong đó x = 4, vì hàm bên dưới số nguyên Toán tử bổ sung được đánh dấuImmutable.

Để 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ị họ.

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ãnDisrile12935_13046Nếu giá trị của nó có thể thay đổi bên 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 BẰNGỔn định, vì giá trị của chúng không thay đổi trong một giao dịch.

Có rất ít sự khác biệt giữaổ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à ngay lập tức được thực hiện: không quan trọng nhiều hơn cho dù Một chức soi kèo bóng đá truoctran được thực hiện một lần trong quá trình lập kế hoạch hoặc một lần trong quá trình truy vấn Khởi động thực thi. Nhưng có một sự khác biệt lớn nếu kế hoạch là Đã 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 Một giá trị cũ được sử dụng lại trong quá trình sử dụng kế hoạch tiếp theo. Đâ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 Ngôn ngữ chức soi kèo bóng đá truoctran mà Cache kế hoạch (chẳng hạn nhưPL/PGSQL14290_14294

Đối với các chức soi kèo bóng đá truoctran được viết bằng SQL hoặc trong bất kỳ tiêu chuẩn nào Ngôn ngữ thủ tục, có một tài sản quan trọng thứ hai được xác định theo thể loại 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 Gọi chức soi kèo bóng đá truoctran. MỘTDisrileHàm sẽ thấy những thay đổi đó, Aổn địnhhoặcbất soi kèo bóng đá truoctranHàm sẽ không. Cái này Hành vi được thực hiện bằng cách sử dụng hành vi nhanh của MVCC (nhìn thấyChươ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 kể từ khi bắt đầu Gọi truy vấn, trong khiDisrileCác chức soi kèo bóng đá truoctran có được một bức ảnh chụp mới khi bắt đầu mỗi truy vấn, chúng thực thi.

Lưu ý:15204_15349

Vì hành vi nhanh chóng này, một chức soi kèo bóng đá truoctran chứa chỉ mộtChọnCác lệnh có thể được an toàn được đánh dấuổn định, ngay cả khi nó chọn từ các bảng có thể đang được sửa đổi theo đồng thời truy vấn.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, và vì vậy nó sẽ Xem 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ọncác lệnh trongbất soi kèo bóng đá truoctranchức soi kèo bóng đá truoctran. Nói chung là không khôn ngoan để Chọn từ các bảng cơ sở dữ liệu trong mộtImmutablechức soi kèo bóng đá truoctran, vì tính bất biến sẽ bị hỏng nếu nội dung bảng thay đổi. Tuy nhiên,PostgreSQLkhông thực thi điều đó 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 một tham số cấu hình. Ví dụ: một chức soi kèo bóng đá truoctran thao túng 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 ý:trướcPostgreSQLPhát hành 8.0, yêu cầu cái đóổn địnhbất soi kèo bóng đá truoctranchức soi kèo bóng đá truoctran không thể sửa đổi cơ sở dữ liệu không được thực thi bởi hệ thống. Phát hành 8.0 trở lên thực thi nó bằng cách yêu cầu các chức soi kèo bóng đá truoctran SQL và ngôn ngữ thủ tục Chức soi kèo bóng đá truoctran của các danh mục này không chứa lệnh SQL Khác vớiChọn. (Đây không phải là một Thử nghiệm 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ọiDisrilyCá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 đá truoctranchức soi kèo bóng đá truoctran không nhận thấy thay đổi cơ sở dữ liệu được áp dụng bởi hàm được gọi, vì chúng được ẩn khỏi ảnh chụp nhanh của nó.)