pg_query_params使用了多少次往返?

时间:2011-06-07 04:55:01

标签: php postgresql

两部分问题。

  1. 根据标题,pg_query_params使用了多少次往返?
  2. 如何计算脚本中数据库往返次数?
  3. 示例代码:

            $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)));
    

    感谢。

1 个答案:

答案 0 :(得分:4)

pg_query_params()仅使用一次往返。这是postgres有线协议的一个功能,它允许单独发送查询和参数,而无需等待两者之间的回复。

您无法真正计算往返次数,但您可以查看源代码,或者只查看查询时间,同时查询非ping时间的服务器。

仅供参考,在localhost上运行的postgres服务器上,使用真实预处理语句(即PDO)在非常简单的查询(因为它使用2个往返)比pg_query_params()慢得多(> 2x ...)。


关于预准备语句:Postgres有多种方法可以执行查询。

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

  • 单次使用预准备语句(pg_query_params):这是协议的一种特殊情况,其中“准备”和“带参数执行”消息在单个数据包中发送。从用户的角度来看,它与原始SQL(一次往返)的速度大致相同,服务器上的解析开销(可能对INSERT大数据有用)稍微少一点,并且自动保护(无引号)。但是,您需要将IN()和VALUES()列表替换为数组(= ANY,unnest())。 Postgres将使用查询计划中的参数值,因此您将获得良好的计划。

  • 真正准备好的语句(PDO,准备等):如果你想支付一次计划成本并执行多次(例如,通常循环中的SQL查询是错误的),这些都很好。两次往返,对于主键上的简单SELECT来说要慢得多。如果你准备了一个无数的计划而不事后解除分配,那么可以记录postgres内存。参数通常不在查询计划中使用(因为它们不可用),因此您可能会获得非最佳查询计划。最后,对于PHP应用程序而言,这是无用的,Postgres和PHP都不会缓存查询计划。如果您使用的应用程序服务器为常见的简单查询保留了缓存查询计划,那么准备好的简单查询(如主键上的SELECT)将比未准备的查询使用更少的服务器CPU(比自称速度快得多)实际上是国王MyISAM。