8

我使用 Perl 和 DBI 来管理我的 MySQL 表、查询等。如何显示查询的运行时间?

如果我在控制台中执行 SELECT,结果将是这样的:

+-----+-------------+
| id  | name        |
+-----+--------------
|   1 | Jack        |
|   2 | Joe         |
|   3 | Mary        |
+-----+-------------+
3 rows in set (0.17 sec)

我需要展示0.17 sec。DBI 中有什么方法可以在 Perl 中显示运行时间,像这样?

my $dbh = $db->prepare("SELECT id, name FROM names ORDER BY id;");
$dbh->execute;
print $dbh->runnin_time; # ???
4

5 回答 5

6

在运行查询之前获取时间戳,然后在之后获取时间戳。不同之处在于您的查询执行时间。如需获取高分辨率时间戳,请参阅Time::HiRes

于 2012-05-29T12:29:12.167 回答
6

DBI#Profile , DBI::Profile , DBI::ProfileData , DBI::ProfileDumper , dbiprof

于 2012-05-29T15:26:35.587 回答
3

我在 DBI 中找不到任何东西。我认为目前还没有开箱即用的实现,尽管可能是有趣的信息。

另一种方法是获取执行前后的时间,然后做一个简单的区别。您可以在 Perl 脚本中执行此操作,只需在查询执行之前和之后获取时间戳,然后将两者相减即可找到执行时间。

my $start = DateTime->now;
my $dbh = $db->prepare("SELECT id, name FROM names ORDER BY id;");
$dbh->execute;
my $end = DateTime->now;


my $elapsedtime = ($end->subtract_datetime($start))->seconds;
print "Execution time(seconds) : $elapsedtime \n";
于 2012-05-29T13:20:26.643 回答
1

阅读@daxim 的文档链接,有一种简单的方法可以通过运行DBI_PROFILE=2来自DBI::Profile的脚本来实现这一点

示例输出:

DBI::Profile: 53.203692s 50.67% (6725 calls) script.pl @ 2016-01-21 11:51:49
'INSERT INTO FOO ("BAR") VALUES (?)' =>
    0.057596s / 2 = 0.028798s avg (first 0.051621s, min 0.005975s, max 0.051621s)
'INSERT INTO BAZ ("QUX") VALUES (?)' =>
    0.367184s / 44 = 0.008345s avg (first 0.039410s, min 0.002445s, max 0.039410s)
于 2016-01-21T12:01:54.277 回答
1

使用 Time::HiRes 也可以是一种查找查询时间的简单方法。这是一个使用 Time::HiRes 的示例:

use Time::HiRes;

$start_time = Time::HiRes::gettimeofday();

my $dbh = $db->prepare("SELECT id, name FROM names ORDER BY id;");
$dbh->execute;

$end_time = Time::HiRes::gettimeofday();

my $elapsedtime = sprintf("%.6f", $end_time - $start_time);
print "Execution time(seconds) : $elapsedtime \n";
于 2021-11-26T13:23:12.000 回答