gpt4 book ai didi

php - pg_query_params 使用了多少次往返?

转载 作者:行者123 更新时间:2023-11-29 12:01:11 26 4
gpt4 key购买 nike

两部分问题。

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

谢谢。

最佳答案

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

你不能真正计算往返次数,但你可以查看源代码,或者在查询具有非零 ping 时间的服务器时简单地查看查询时间。

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


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

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

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

  • 真正的准备语句(PDO、prepare 等):如果您想支付一次计划成本并执行多次,那么这些语句很好(尽管循环中的 SQL 查询通常是错误的)。两次往返,对于主键上的简单 SELECT 慢得多。如果您准备了不计其数的计划但事后没有重新分配它们,可能会占用 postgres 内存。参数通常不用于查询计划(因为那时它们不可用),因此您可能会得到非最佳查询计划。最后,这对于 Postgres 和 PHP 都不会缓存查询计划的 PHP 应用程序来说毫无用处。如果您使用的应用程序服务器为常见的简单查询保留缓存的查询计划,那么准备好的简单查询(如主键上的 SELECT)将比未准备的简单查询使用更少的服务器 CPU(比自称的速度快得多实际上是 MyISAM 之王)。

关于php - pg_query_params 使用了多少次往返?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com