Oracle vs PostgreSQL Develop(16) - Prepared Statement
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,对于除绑定变量外其余相同的SQL语句,PostgreSQL提供了Prepared Statement用于缓存Plan,以达到Oracle中cursor_sharing=force的目的.PSQL通过p
千家信息网最后更新 2025年11月13日Oracle vs PostgreSQL Develop(16) - Prepared Statement
对于除绑定变量外其余相同的SQL语句,PostgreSQL提供了Prepared Statement用于缓存Plan,以达到Oracle中cursor_sharing=force的目的.
PSQL
通过prepare语句,可为SQL生成Prepared Statement,减少Plan的时间
[local]:5432 pg12@testdb=# explain (analyze,verbose) select * from t_prewarm where id = 1; QUERY PLAN -------------------------------------------------------------------------------------------- Index Scan using idx_t_prewarm_id on public.t_prewarm (cost=0.42..8.44 rows=1 width=13) (actual time=0.125..0.127 rows=1 loops=1) Output: id, c1 Index Cond: (t_prewarm.id = 1) Planning Time: 0.613 ms Execution Time: 0.181 ms(5 rows)Time: 2.021 ms[local]:5432 pg12@testdb=# explain (analyze,verbose) select * from t_prewarm where id = 1; QUERY PLAN -------------------------------------------------------------------------------------------- Index Scan using idx_t_prewarm_id on public.t_prewarm (cost=0.42..8.44 rows=1 width=13) (actual time=0.184..0.193 rows=1 loops=1) Output: id, c1 Index Cond: (t_prewarm.id = 1) Planning Time: 0.520 ms Execution Time: 0.276 ms(5 rows)不使用prepare,可看到每次的Planning时间比Execution时间还要长
[local]:5432 pg12@testdb=# prepare p(int) as select * from t_prewarm where id=$1;PREPARETime: 1.000 ms[local]:5432 pg12@testdb=# explain (analyze,verbose) execute p(2); QUERY PLAN -------------------------------------------------------------------------------------------- Index Scan using idx_t_prewarm_id on public.t_prewarm (cost=0.42..8.44 rows=1 width=13) (actual time=0.037..0.039 rows=1 loops=1) Output: id, c1 Index Cond: (t_prewarm.id = 2) Planning Time: 0.323 ms Execution Time: 0.076 ms(5 rows)Time: 1.223 ms[local]:5432 pg12@testdb=# explain (analyze,verbose) execute p(3); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------ Index Scan using idx_t_prewarm_id on public.t_prewarm (cost=0.42..8.44 rows=1 width=13) (actual time=0.077..0.081 rows=1 loops=1) Output: id, c1 Index Cond: (t_prewarm.id = $1) Planning Time: 0.042 ms Execution Time: 0.174 ms(5 rows)Time: 1.711 ms[local]:5432 pg12@testdb=# explain (analyze,verbose) execute p(4); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------ Index Scan using idx_t_prewarm_id on public.t_prewarm (cost=0.42..8.44 rows=1 width=13) (actual time=0.042..0.044 rows=1 loops=1) Output: id, c1 Index Cond: (t_prewarm.id = $1) Planning Time: 0.019 ms Execution Time: 0.084 ms(5 rows)使用prepare,可看到Planning时间明显降低
JDBC Driver
下面是测试代码
/* * TestPlanCache * * Copyright (C) 2004-2016, Denis Lussier * Copyright (C) 2016, Jan Wieck * */package testPG;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class TestPGPlanCache { public static void main(String[] args) { Connection conn = null; Statement stmt = null; String rLine = null; StringBuffer sql = new StringBuffer(); try { Properties ini = new Properties(); // ini.load(new FileInputStream(System.getProperty("prop"))); // Register jdbcDriver Class.forName("org.postgresql.Driver"); // make connection conn = DriverManager.getConnection("jdbc:postgresql://192.168.26.28:5432/testdb", "pg12", "pg12"); conn.setAutoCommit(true); PreparedStatement pstmt = conn.prepareStatement("SELECT * from t_prewarm where id = ?"); // cast to the pg extension interface org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class); // on the third execution start using server side statements // pgstmt.setPrepareThreshold(3); for (int i = 1; i <= 10; i++) { pstmt.setInt(1, i); boolean usingServerPrepare = pgstmt.isUseServerPrepare(); ResultSet rs = pstmt.executeQuery(); rs.next(); System.out.println( "Execution: " + i + ", Used server side: " + usingServerPrepare + ", Result: " + rs.getInt(1)); rs.close(); } pstmt.close(); } catch (SQLException se) { System.out.println(se.getMessage()); } catch (Exception e) { e.printStackTrace(); // exit Cleanly } finally { try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } // end finally } // end try } // end main} // end ExecJDBC Class输出为
Execution: 1, Used server side: false, Result: 1Execution: 2, Used server side: false, Result: 2Execution: 3, Used server side: false, Result: 3Execution: 4, Used server side: false, Result: 4Execution: 5, Used server side: true, Result: 5Execution: 6, Used server side: true, Result: 6Execution: 7, Used server side: true, Result: 7Execution: 8, Used server side: true, Result: 8Execution: 9, Used server side: true, Result: 9Execution: 10, Used server side: true, Result: 105次后开始使用服务器端的Prepared Statement.
参考资料
Server Prepared Statements
时间
语句
明显
相同
代码
参考资料
变量
服务器
目的
端的
缓存
资料
参考
服务
测试
生成
输出
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手机版服务器指令推荐
2022省市区数据库
校园安全正能量网络安全共担当
用什么app做软件开发
字节跳动网络安全工程师招聘
网络安全教育标准工作
阿里云服务器配置选择
财务报表系统软件开发多少钱
数据库自动优化工具
如何快速更改服务器
db2远程重启数据库
为啥注册反诈中心时找不到服务器
BT盒子充值服务器码
碧蓝航线的服务器分渠道服和什么
我的世界服务器管理员都怎么了
食品安全调查官方数据库
成都市5g网络安全
基因科技能超过互联网
核探测器软件开发
北京互联网新科技发展
铁西区软件开发培训学校
中国科学文献数据库
驿公里互联网科技
江阴创新软件开发职能
高职工业网络技术
线上数据库如何做分局分表
芒果db数据库是国产化么
查看sql数据库 数据
基于网络安全下竞争情报
从dhcp服务器获取ip失败