注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

数据库客户端使用Prepared Statement方式执行sql查询的优点  

2015-01-10 01:40:12|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近看postgresql数据库的c语言客户端libpg看到出来常规的PQexec函数执行sql用法之外,还有下面这个先prepare后execute的用法:
http://www.postgresql.org/docs/9.4/static/libpq-exec.html#LIBPQ-EXEC-MAIN
PQprepare
PQexecPrepared
直觉这个相对PQexec还有一些优点的。特别是那些重复执行多次的命令。

看到mysql里面也是有类似的用法的。其他数据库估计也都有。
http://dev.mysql.com/doc/refman/5.7/en/c-api-prepared-statements.html
介绍的优点有
1.  对于sql查询命令,server只需做一次sql语法解析和执行优化等。后面的重复执行多次的都不需要再解析了,因为prepare时候就已经做好了。
2.、网络带宽占用更小,因为每次执行之需要发送后面的参数数据了。sql语句部分不需要每次都发送了。
3.、 参数的传递是以二进制格式的形式传递的。 普通的PQexec先是需要把int ,bool等参数都用sprintf或者itoa其他函数格式化为sql命令的字符串。 这种开销还是很大的,以前程序经常看到cpu性能瓶颈都是在格式化字符串上面。 但使用PQexecPrepared,参数都是以二进制的形式发送的。client端和server端不需要重复的做没必要的做这种格式化。
4.  没有字符串格式化,就可以避免sql注入问题了。

可能的缺点?
1.  使用的不一定比普通的方式执行的快,要测试才行。
2.   有的复杂sql优化可能没法做? wiki网页说 postgresql里面说是prepare这步会做了优化之后,后面PQexecPrepared的就不会再有更深入的优化了。 这可能导致某些复杂的sql语句,依赖后面参数的才能做的优化没法执行?
     但我看普通的insert,update的简单语句,没有什么大的影响吧。重复的很适合这个prepare的方式使用。
3.  有的场合使用存储过程可以达到同样的效果。



mysql的c语言的client端大概到这几个函数
mysql_stmt_init
mysql_stmt_prepare     提交sql 语句 模板到server端进行预处理好,得到对应的id
mysql_stmt_bind_param   指定prepare好的sql模板参数,二进制数据数组。 mysql直接把二进制数据比如int的指针放到数组就可以了。但PQexecPrepared 对数值类型竟然要求自己做 network order网络字节序的转换,太反人类了
mysql_stmt_execute    执行。
mysql_stmt_bind_result() 指定读取结果需要 二进制数据的数组
这里面有个例子:
http://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html
全部相关函数列表:
22.8.10 C API Prepared Statement Function Overview
http://dev.mysql.com/doc/refman/5.7/en/c-api-prepared-statement-function-overview.html
  评论这张
 
阅读(356)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017