我连接了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/