Dbix :: Class响应慢

时间:2015-06-18 18:05:10

标签: catalyst dbix-class

我有一个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,同样的查询速度非常快。

一些信息:

  • Catalyst 5.90091
  • DBIx :: Class 0.082820(最新)
  • Postgres 9.1
  • 我使用Catalyst内部服务器对localhost进行了所有测试。
  • 我对任何其他表/列组合没有任何问题,它与proto_id有关。
  • DBIx :: Class :: Schema :: Loader
  • 自动生成的数据库架构
  • 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问题。

1 个答案:

答案 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数据库驱动程序已更新。