PREPARE

Name

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

Synopsis

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

描述

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

準備好的查詢可以接受參數:在它執行的時候替換到查詢中的數值。 要給一個準備好的查詢聲明參數,我們需要在 PREPARE 語句裡包含一個資料類型的列資料表。在查詢本身裡,您可以按照位置來引用這些參數, 比如 $1$2,等。 在執行查詢的時候,在 EXECUTE 語句裡為這些參數聲明實際的數值。 參考 EXECUTE 獲取更多訊息。

準備好的查詢是在本地儲存的(在目前後端裡),並且只是在目前資料庫會話的過程中存在。 如果客戶端退出,那麼準備好的查詢就會被遺忘,因此我們必須在被重新使用之前重新建立。 這也意味著一個準備好的查詢不能被多個同時的資料庫客戶端使用; 但是,每個客戶端可以建立它們自己的已準備好的查詢來使用。已準備好的語句可以用 DEALLOCATE 命令手工清除。

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

參數

plan_name

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

datatype

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

statement

任何 SELECTINSERTUPDATE, 或者 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);

相容性

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

又見

DEALLOCATE, EXECUTE