zoukankan      html  css  js  c++  java
  • 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,提高效率。

  • 相关阅读:
    bzoj4563: [Haoi2016]放棋子(错排+高精)
    bzoj1089 [SCOI2003]严格n元树(dp+高精)
    9.15NOIP模拟题
    洛谷 P2010 回文日期 题解
    洛谷 P1147 连续自然数和 题解
    洛谷 P1152 欢乐的跳 题解
    信息学奥赛一本通 高手训练1 统计方案数
    想学习找不到好的博客?看这里>>
    信息学奥赛一本通 高手训练1 游戏通关
    洛谷 P3398 仓鼠找sugar 题解
  • 原文地址:https://www.cnblogs.com/kuang17/p/14005372.html
Copyright © 2011-2022 走看看