PREPARE(7)

NAME
PREPARE - 建立一個準備好的查詢

SYNOPSIS

PREPARE plan_name [ (datatype [, ...] ) ] AS statement

DESCRIPTION 描述

PREPARE 建立一個已準備好的查詢。 一個已準備好的查詢是伺服器端的物件，可以用於最佳化效能。 在執行 PREPARE 語句的時候，指定的查詢被分析，重寫以及規劃。 當隨後發出 EXECUTE 語句的時候， 已準備好的查詢就只需要執行了。因此，分析，重寫，以及規劃階段都只執行一次，而不是每次查詢執行的時候都要執行一次。

 準備好的查詢可以接受引數：在它執行的時候替換到查詢中的數值。 要給一個準備好的查詢宣告引數，我們需要在 PREPARE 語句裡包含一個數據型別的列表。在查詢本身裡，你可以按照位置來引用這些引數， 比如 $1，$2，等。 在執行查詢的時候，在 EXECUTE 語句裡為這些引數宣告實際的數值。 參考 EXECUTE [execute(7)] 獲取更多資訊。

 準備好的查詢是在本地儲存的（在當前後端裡），並且只是在當前資料庫會話的過程中存在。 如果客戶端退出，那麼準備好的查詢就會被遺忘，因此我們必須在被重新使用之前重新建立。 這也意味著一個準備好的查詢不能被多個同時的資料庫客戶端使用； 但是，每個客戶端可以建立它們自己的已準備好的查詢來使用。

 如果一個會話準備用於執行大量類似的查詢，那麼已準備好的查詢可以獲得最大限度的效能優勢。 如果查詢非常複雜，需要複雜的規劃或者重寫，那麼效能差距將非常明顯。 比如，如果查詢設計許多表的連線，或者有多種規則要求應用。如果查詢的規劃和重寫相對簡單， 而執行起來開銷相當大，那麼已準備好的查詢的效能優勢就不那麼明顯。

PARAMETERS 引數

plan_name
     給予這個特定的已準備好查詢的任意名字。它必須在一個會話中是唯一的， 並且用於執行或者刪除一個前面準備好的查詢。

datatype
     已準備好查詢的某個引數的資料型別。要在已準備好查詢內部引用這個引數，使用 $1，$2，等。

statement
     任何 SELECT, INSERT, UPDATE, 或 DELETE 語句。

NOTES 注意

 在一些情況下，PostgreSQL 為一個已準備好的查詢生成的查詢規劃可能還不如按照普通方法提交併執行的查詢生成的規劃好。 這是因為該查詢在被規劃的時候（也是最佳化器檢視判斷最優查詢規劃的時候）， 在查詢中宣告的任何引數的實際數值都還不可見。 PostgreSQL 在表中收集資料分佈的統計， 而且可以利用查詢中的常量來猜測執行查詢的可能結果。 因為這些資料在準備哪種帶引數的查詢的規劃的時候還不可得， 所以，選出來得規劃可能是次好的。 要檢查 PostgreSQL 為已準備好的查詢選取的查詢計劃， 使用 EXPLAIN EXECUTE 。

 有關查詢規劃和 PostgreSQL 為查詢最佳化的目的收集的統計的更多資訊， 參閱 ANALYZE [analyze(7)] 文件。

COMPATIBILITY 相容性

 SQL 標準包含一個 PREPARE 語句， 但是它只用於嵌入的 SQL 客戶端。PostgreSQL 實現的 PREPARE 語句的語法也略有不同。

譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh