Name
PREPARE -- 建立一個準備好的查詢
Synopsis
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
描述
PREPARE 建立一個已準備好的查詢。 一個已準備好的查詢是伺服器端的對象,可以用於最佳化效能。 在執行 PREPARE 語句的時候,指定的查詢被分析,重寫以及規劃。 當隨後發出 EXECUTE 語句的時候, 已準備好的查詢就只需要執行了。因此,分析,重寫,以及規劃階段都只執行一次,而不是每次查詢執行的時候都要執行一次。
準備好的查詢可以接受參數:在它執行的時候替換到查詢中的數值。 要給一個準備好的查詢聲明參數,我們需要在 PREPARE 語句裡包含一個資料類型的列表。在查詢本身裡,你可以按照位置來引用這些參數, 比如 $1,$2,等。 在執行查詢的時候,在 EXECUTE 語句裡為這些參數聲明實際的數值。
參考 EXECUTE 擷取更多資訊。
準備好的查詢是在本機存放區的(在當前後端裡),並且只是在當前資料庫會話的過程中存在。 如果用戶端退出,那麼準備好的查詢就會被遺忘,因此我們必須在被重新使用之前重新建立。 這也意味著一個準備好的查詢不能被多個同時的資料庫用戶端使用; 但是,每個用戶端可以建立它們自己的已準備好的查詢來使用。已準備好的語句可以用DEALLOCATE 命令手工清除。
如果一個會話準備用於執行大量類似的查詢,那麼已準備好的查詢可以獲得最大限度的效能優勢。 如果查詢非常複雜,需要複雜的規劃或者重寫,那麼效能差距將非常明顯。 比如,如果查詢設計許多表的串連,或者有多種規則要求應用。如果查詢的規劃和重寫相對簡單, 而執行起來開銷相當大,那麼已準備好的查詢的效能優勢就不那麼明顯。
參數
plan_name
-
給予這個特定的已準備好查詢的任意名字。它必須在一個會話中是唯一的, 並且用於執行或者刪除一個前面準備好的查詢。
-
datatype
-
已準備好查詢的某個參數的資料類型。要在已準備好查詢內部引用這個參數,使用 $1,$2,等。
-
statement
-
任何 SELECT,INSERT,UPDATE, 或者 DELETE 查詢。
注意
在一些情況下,PostgreSQL 為一個已準備好的查詢產生的查詢規劃可能還不如按照普通方法提交並執行的查詢產生的規劃好。 這是因為該查詢在被規劃的時候(也是最佳化器視圖判斷最優查詢規劃的時候), 在查詢中聲明的任何參數的實際數值都還不可見。 PostgreSQL 在表中收集資料分布的統計,
而且可以利用查詢中的常量來猜測執行查詢的可能結果。 因為這些資料在準備哪種帶參數的查詢的規劃的時候還不可得, 所以,選出來得規劃可能是次好的。 要檢查 PostgreSQL 為已準備好的查詢選取的查詢計劃, 使用 EXPLAIN。
有關查詢規劃和 PostgreSQL 為查詢最佳化的目的收集的統計的更多資訊, 參閱 ANALYZE 文檔。
例子
為一個 INSERT 語句建立一個準備好查詢然後執行它:
PREPARE fooplan (int, text, bool, numeric) AS INSERT INTO foo VALUES($1, $2, $3, $4);EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
為一個 SELECT
語句建立一個執行好的查詢然後執行它:
PREPARE usrrptplan (int, date) AS SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid AND l.date = $2;EXECUTE usrrptplan(1, current_date);