php - 为什么 greenplum 的准备速度这么慢?

标签 php postgresql pdo greenplum

我连接了greenplum,我发现pdo太慢了

我的测试脚本是这样的

<?php
$sql="select keyword from r_keyword_hour where domainId = '68955' and date    >= '2017-01-17' and date < '2017-01-18'   limit 10 offset 0";
$start2 = microtime(true);
$con = pg_connect("host=xxx user=xxx dbname=xxx connect_timeout=5 port=xxx password=21fdcebd7156d1b9");
$result2 = pg_query($con,$sql);
$test=pg_fetch_all($result2);
$end2 = microtime(true);
$start = microtime(true);
$d=new PDO('pgsql:host=xxx user=xxx dbname=xxx connect_timeout=5 port=xxx password=xxx');
$result=$d->query($sql);
$end = microtime(true);
#var_dump($end-$start);
#var_dump($end2-$start2);
echo strval($end-$start)."\t".strval($end2-$start2)."\n"
?>

结果是 pdo 使用 1.8 秒,但 pg_* 仅使用 0.7 秒。当greenplum重载时,pdo变成了53.9s,但是pg_*只有5s。为什么pdo这么慢?

更新: 正常情况下,整个pdo查询花费1.6s,“$result=$d->query($sql);”几乎花费了所有这 1.6 秒,可能大约有 0.01 秒不同。对于 pg_* 查询,如果我使用“$result2 = pg_query($con,$sql)”方法,它只需要大约 0.8 秒,如果我使用方法@Stephen Carter建议,先prepare,大约需要1.5s。有时如果gp机器过载,pdo会需要大约26s,此时pg_*和prepare需要18s,而pg_query只需要2s

更新2: 我捕获了pdo请求的数据包,发现“$result=$d->query($sql)”也使用了postgresql的prepare。我不确定是否有办法让PDO不使用prepare。但是现在,我们可以知道prepare会减慢greenplum的速度,我会继续努力寻找原因。

最佳答案

你不是在比较同类。

pg_query 正在执行一个简单的查询。

PDO 正在准备一条语句,然后执行它。

如果您使用 pg_* 函数执行准备好的语句,则执行时间应该相似,至少在我测试时是这样。

$sql="SELECT * FROM table1 WHERE id > 500";

$con = pg_connect("**********");
$pre = pg_prepare($con, "my_query", $sql);
$exe = pg_execute($con, "my_query", array());
$result=pg_fetch_all($exe);

$d=new PDO("**********");
$sth=$d->prepare($sql);
$sth->execute();
$result = $sth->fetchAll();

或者您也许可以更改 PDO 方法以避免执行准备语句。

关于php - 为什么 greenplum 的准备速度这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41740384/

相关文章:

python - 在使用 UUID 字段作为主字段的 Django 模型中添加非主键自动字段或 'serial' 字段

php - preg_match : ensure the start and the end contains something

php - 逆向工程位掩码以获取权限列表

php - MySql 事务仅在控制台中有效

php - 在带有 PHP5.3.6 的 LAMP 上启用 MsSQL PDO 驱动程序

php - PDO bindParam 破坏 mySQL 查询

php - 如何判断 PDO 模块是否已安装/禁用?

php - CakePHP - 只是布局?

postgresql - PostgreSQL 中的复制槽是否会阻止删除 WALL,即使它们来自另一个数据库?

python - 将 UTC 时间戳转换为正常日期和时间