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,提高效率。