PREPARE
SYNOPSIS
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
DESCRIPTION 描述
PREPARE 創(chuàng)建一個已準(zhǔn)備好的查詢。 一個已準(zhǔn)備好的查詢是服務(wù)器端的對象,可以用于優(yōu)化性能。 在執(zhí)行 PREPARE 語句的時候,指定的查詢被分析,重寫以及規(guī)劃。 當(dāng)隨后發(fā)出 EXECUTE 語句的時候, 已準(zhǔn)備好的查詢就只需要執(zhí)行了。因此,分析,重寫,以及規(guī)劃階段都只執(zhí)行一次,而不是每次查詢執(zhí)行的時候都要執(zhí)行一次。
準(zhǔn)備好的查詢可以接受參數(shù):在它執(zhí)行的時候替換到查詢中的數(shù)值。 要給一個準(zhǔn)備好的查詢聲明參數(shù),我們需要在 PREPARE 語句里包含一個數(shù)據(jù)類型的列表。在查詢本身里,你可以按照位置來引用這些參數(shù), 比如 $1,$2,等。 在執(zhí)行查詢的時候,在 EXECUTE 語句里為這些參數(shù)聲明實(shí)際的數(shù)值。 參考 EXECUTE [execute(7)] 獲取更多信息。
準(zhǔn)備好的查詢是在本地存儲的(在當(dāng)前后端里),并且只是在當(dāng)前數(shù)據(jù)庫會話的過程中存在。 如果客戶端退出,那么準(zhǔn)備好的查詢就會被遺忘,因此我們必須在被重新使用之前重新創(chuàng)建。 這也意味著一個準(zhǔn)備好的查詢不能被多個同時的數(shù)據(jù)庫客戶端使用; 但是,每個客戶端可以創(chuàng)建它們自己的已準(zhǔn)備好的查詢來使用。
如果一個會話準(zhǔn)備用于執(zhí)行大量類似的查詢,那么已準(zhǔn)備好的查詢可以獲得最大限度的性能優(yōu)勢。 如果查詢非常復(fù)雜,需要復(fù)雜的規(guī)劃或者重寫,那么性能差距將非常明顯。 比如,如果查詢設(shè)計(jì)許多表的連接,或者有多種規(guī)則要求應(yīng)用。如果查詢的規(guī)劃和重寫相對簡單, 而執(zhí)行起來開銷相當(dāng)大,那么已準(zhǔn)備好的查詢的性能優(yōu)勢就不那么明顯。
PARAMETERS 參數(shù)
plan_name
給予這個特定的已準(zhǔn)備好查詢的任意名字。它必須在一個會話中是唯一的, 并且用于執(zhí)行或者刪除一個前面準(zhǔn)備好的查詢。
datatype
已準(zhǔn)備好查詢的某個參數(shù)的數(shù)據(jù)類型。要在已準(zhǔn)備好查詢內(nèi)部引用這個參數(shù),使用 $1,$2,等。
statement
任何 SELECT, INSERT, UPDATE, 或 DELETE 語句。
NOTES 注意
在一些情況下,PostgreSQL 為一個已準(zhǔn)備好的查詢生成的查詢規(guī)劃可能還不如按照普通方法提交并執(zhí)行的查詢生成的規(guī)劃好。 這是因?yàn)樵摬樵冊诒灰?guī)劃的時候(也是優(yōu)化器視圖判斷最優(yōu)查詢規(guī)劃的時候), 在查詢中聲明的任何參數(shù)的實(shí)際數(shù)值都還不可見。 PostgreSQL 在表中收集數(shù)據(jù)分布的統(tǒng)計(jì), 而且可以利用查詢中的常量來猜測執(zhí)行查詢的可能結(jié)果。 因?yàn)檫@些數(shù)據(jù)在準(zhǔn)備哪種帶參數(shù)的查詢的規(guī)劃的時候還不可得, 所以,選出來得規(guī)劃可能是次好的。 要檢查 PostgreSQL 為已準(zhǔn)備好的查詢選取的查詢計(jì)劃, 使用 EXPLAIN EXECUTE 。
總結(jié)
- 上一篇: Python 读取 .mdb文件信息
- 下一篇: Spring Security OAut