я подключаю 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.8s, а pg_ * просто использует 0.7s. когда гринплюм перегружен, pdo стал 53.9s, но pg_ * просто 5s. почему pdo такой медленный?
Обновить:
как правило, весь запрос pdo тратит 1,6 с, а «$ result = $ d-> query ($ sql);» потратить почти все эти 1.6 с, может быть около 0,01 с. Как и в случае запросов pg_ *, если я использую метод «$ result2 = pg_query ($ con, $ sql)», ему просто потребуется около 0,8 с, и если я использую метод как @ Стефен Картер предложил, подготовьтесь сначала, ему нужно около 1,5. Иногда, если перегрузка gp-машины, pdo займет около 26 с, в настоящее время pg_ * с подготовкой нужно 18 с, а pg_query просто нужно 2 с.
Update2:
Я перехватил пакет запроса pdo и обнаружил, что «$ result = $ d-> query ($ sql)» также использует prepare из postgresql. Я не уверен, что есть способ для PDO не использовать prepare. Но теперь мы могу знать, что подготовка замедлит зеленую сливу, я буду продолжать пытаться выяснить, почему.
Вы не сравниваете подобное с подобным.
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, чтобы избежать подготовки оператора.
Других решений пока нет …