Непосредственно, нет, нет. Но вы можете сделать косвенную и довольно близкую оценку, проверив время прямо перед вами и сразу после запроса, который вам интересен.
$sql = "Your Query";
$bm = "SELECT extract(epoch FROM clock_timestamp())";
$query = "{$bm}; {$sql}; {$bm};";
Функция clock_timestamp() дает вам фактическое время сервера, когда начинается инструкция. Поскольку SELECT не содержит таблиц, мы можем ожидать, что это будет почти мгновенно. Я предполагаю, что любой драйвер Pg предлагает поддержку нескольких запросов; важно, чтобы эти 3 запроса (реальный и 2 дополнения) объединились, иначе вы также будете измерять время передачи данных ...
Для PHP У меня есть функция для обработки этого. В итоге это выглядит так:
<?php
function pgquery($sql, $conn)
{
// Prepend and append benchmarking queries
$bm = "SELECT extract(epoch FROM clock_timestamp())";
$query = "{$bm}; {$sql}; {$bm};";
// Execute the query, and time it (data transport included)
$ini = microtime(true);
pg_send_query($conn, $query);
while ($resource = pg_get_result($conn))
{
$resources[] = $resource;
}
$end = microtime(true);
// "Extract" the benchmarking results
$q_ini = pg_fetch_row(array_shift($resources));
$q_end = pg_fetch_row(array_pop($resources));
// Compute times
$time = round($end - $ini, 4); # Total time (inc. transport)
$q_time = round($q_end[0] - $q_ini[0], 4); # Query time (Pg server only)
return $resources;
}
?>
Я только что оставил основы. $ conn содержит ссылку на соединение Pg, а $ resources - массив возвращаемых ресурсов pg (в случае, если вы отправили несколько запросов в вашем sql-файле).
$ Время имеет общее время, так как запрос остается на сервере Pg до тех пор, пока результат не достигнет результата. $ q-time содержит только фактическое время запроса (или очень хорошее приближение).
Добавить обработку ошибок и другую обработку по своему вкусу, у меня много, но это не имеет отношения к вашему вопросу.
Есть ли способ просто вывести время, так что мне не нужно разбирать файл? Это то, что я буду делать, если понадобится, но похоже, что должен быть более простой способ. –
'psql -c" EXPLAIN ANALYZE выберите * from mytable where col1 ... "| grep «Total runtime» ' –
Я действительно ищу способ сделать это полностью в SQL, если это возможно. Похоже, я должен иметь возможность хранить среду выполнения, которую она возвращает в интерактивной оболочке psql непосредственно как значение. Ваш ответ совершенно верный и является тем, что я планировал делать, если никто не может дать мне ответ на чистый SQL. Спасибо за ваше время! –