2011-06-07 98 views
2

两部分问题。pg_query_params使用多少次往返?

  1. 根据标题,pg_query_params使用了多少往返行程?
  2. 如何计算脚本中的数据库往返次数?

示例代码:

 $result = pg_query_params($pg_connection, <<<'EOQ' 
INSERT INTO accounts (username, salt, hash, created, lastlogin) 
    VALUES ($1, $2, $3, NOW(), NOW()) 
EOQ 
        , array($username, $salt, crypt($password, $salt))); 

感谢。

回答

4

pg_query_params()只使用一次往返。这是postgres有线协议的一个特性,它允许分别发送查询和参数,而不必等待两者之间的回复。

实际上,你不能计数往返,但可以查看源代码,或者查询具有非零ping时间的服务器时查看查询时间。

仅在非常简单的查询(因为它使用2往返)比使用pg_query_params()时,在使用真实准备语句(即PDO)的本地主机上运行的postgres服务器上,FYI要慢得多(> 2倍...)。


关于准备好的语句:Postgres有几种执行查询的方法。

  • 原始SQL嵌入参数(OLDSKOOL方式):它仍然是有用的,只有这样,才能构建()或VALUES()列表。处理引用的适当的API层是必须的(a python DBAPI)。在用户代码中直接调用quote()的任何痕迹都是麻烦的迹象!

  • 一次性使用准备语句(pg_query_params):这是“Prepare”和“带参数执行”消息在单个数据包中发送的协议的特例。从用户的角度来看,它的速度与原始SQL大致相同(一次往返),服务器上的解析开销稍小(可能对INSERT大数据有用),并且自动保护(不引用)。不过,你需要用数组替换IN()和VALUES()列表(= ANY,unnest())。 Postgres将使用查询计划中的参数值,所以你会得到很好的计划。

  • 准备好的语句(PDO,准备等):如果您想支付一次计划成本并执行多次(尽管通常循环中的SQL查询是一个错误),那么这些都很好。两次往返,主键上的简单SELECT更慢。如果你准备了一个亿万美元的计划,而没有在之后释放他们,可以支持postgres。查询计划中通常不使用参数(因为它们当时不可用),因此您可能会得到非最优查询计划。最后,这对于Postgres和PHP都不会缓存查询计划的PHP应用程序来说都是无用的。如果你使用一个应用服务器来为常见的简单查询保留缓存的查询计划,那么一个准备好的简单查询(比如主键上的SELECT)将比未准备好的服务器CPU使用更少的服务器CPU(比自称速度快得多国王MyISAM实际上)。

+0

谢谢。通过“查看源代码”,你的意思是看看pg模块的C源代码吗?另外,是的,PDO问题或多或少是我在这个过程中遇到的问题。如果任何人有任何简单的问题#2 – Dragontamer5788 2011-06-07 11:57:54

+0

是的话,我还会保持这个开放一两天。源代码是最终的文档不是它!关于PDO准备的陈述:我要编辑我的文章。 – peufeu 2011-06-07 17:10:00

+0

Postgresql与PDO不支持模拟准备模式? – 2011-06-07 17:31:43