我有一个DBIx :: Class查询需要很长时间才能完成。
下面的所有SQL都是由DBIx :: Class生成的。
第一种情况(DBIx简单选择):
SELECT me.pf_id, me.origin_id, me.event_time, me.proto_id FROM pf me ORDER BY event_time DESC LIMIT 10;
DBIx查询时间:0.390221s(ok)
第二种情况(DBIx简单选择使用位置):
SELECT me.pf_id, me.origin_id, me.event_time, me.proto_id FROM pf me WHERE ( proto_id = 7 ) ORDER BY event_time DESC LIMIT 10;
DBIx查询时间:29.27025s !! :(
第三种情况(使用pgadmin3运行上述查询):
SELECT me.pf_id, me.origin_id, me.event_time, me.proto_id FROM pf me WHERE ( proto_id = 7 ) ORDER BY event_time DESC LIMIT 10;
Pgadmin查询时间:25ms(ok)
使用pgdamin,同样的查询速度非常快。
一些信息:
proto_id定义:
“proto_id”, {data_type => “smallint”,is_foreign_key => 1,is_nullable => 0},
任何人都知道为什么DBIx需要这么长时间来运行这个简单的查询?
编辑1 :列正在使用索引(btree)。
编辑2 :这是一个分区表,我正在检查所有子表是否都包含所有索引,但仍然无法解释为什么DBIx上相同的查询速度较慢::类。
编辑3 :我做了一个简单的DBIx :: Class script,我得到了相同的结果,只是为了确保问题不是Catalyst Framework。
编辑4 :使用tcpdump我注意到postgres响应时间太长,仍在尝试...
编辑5 :Using DBI with SQL似乎相当快,我几乎确信这是一个DBIx :: Class问题。
答案 0 :(得分:0)
经过一些测试,我发现了问题:
当我使用DBI bind_param()(因为DBIx :: Class确实)执行查询时出于某种原因它变得非常慢。
SELECT me.pf_id, me.origin_id, me.event_time, me.proto_id FROM pf me WHERE ( proto_id = ? ) ORDER BY event_time DESC LIMIT ?;
my $sth = $dbh->prepare($sql);
$sth->bind_param(1, 80, { TYPE => SQL_INTEGER });
$sth->bind_param(2, 10, { TYPE => SQL_INTEGER });
$sth->execute();
所以经过一段时间搜索CPAN后,我注意到我的DBD::Pg已经过时了(我的不好)。我从CPAN下载了源码,编译后问题就消失了。必须是旧版本的一些错误。
TL; DR:如果您遇到DBI或DBIx :: Class问题,请确保您的DBI数据库驱动程序已更新。