PostgreSQL prepare的使用


prepare的使用:

眾所周知,在執行一個SQL時,首先生成執行計划(進行語義分析、詞法解析、邏輯優化、物理優化)、執行、結果傳輸等操作。
如果一個SQL在應用中反復使用,我們可以將此SQL參數化,只做一次prepare,后面執行時就不需要進行前面執行計划的生成操作,直接使用prepare好的執行計划。

對於比較長的SQL、參數較固定的SQL,可以使用prepare,下面做個簡單的舉例:

特點:
1) Prepared語句只在session的整個生命周期中存在,一旦session結束,Prepared語句也不存在了。如果下次再使用需重新創建。
2) Prepared語句不能在多個並發的client中共有。
3) prepared語句可以通過DEALLOCATE命令清除。
4) 當前session的prepared語句:pg_prepared_statements

1.在存儲過程中使用:

DO
$$
DECLARE 
ret_ref refcursor;
one_row record;
BEGIN 
PREPARE test_pre(int, text) AS INSERT INTO test values($1, $2);	
--EXECUTE test_pre(1, 'test_pre'); --如果不用execute包一層,會認為是個函數,會報錯,要用下面的
EXECUTE 'EXECUTE test_pre(1, ''test_pre'')';
DEALLOCATE PREPARE test_pre;

OPEN ret_ref FOR SELECT * FROM test;

FETCH ret_ref INTO one_row;
WHILE ret_ref%FOUND LOOP
raise notice 'id is: %, text is: %', one_row.id, one_row.text;
FETCH NEXT IN ret_ref INTO one_row;
END LOOP;

CLOSE ret_ref;
--truncate test;
END 
$$

  


2.在客戶端上使用:
--可以在管理工具、命令行工具直接使用,session級別生效:

PREPARE test_pre1(int, text) AS INSERT INTO test values($1, $2);
EXECUTE test_pre1(1, 'test_pre');

SELECT * FROM test;

  

3.在ECPG、JAVA、.NET中都可以先對反復執行的,只有參數變化的SQL先進行prepare,提高效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM