当前位置: 首页 > 知识库问答 >
问题:

dbix::Class慢响应

嵇浩淼
2023-03-14

我有一个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(正常)

第二种场景(使用where的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”{data_type=

有人知道为什么DBIx要花这么长时间来运行这个简单的查询吗?

编辑1:列正在使用索引(btree)。

编辑2:这是一个分区表,我正在检查是否所有的子表都有所有的索引,但是仍然没有解释为什么相同的查询在DBIx::Class上慢。

编辑3:我做了一个简单的DBIx::Class脚本,得到了相同的结果,只是为了确保问题不是Catalyst框架。

编辑4:我注意到postgres花了太长的时间来响应,仍然在尝试使用tcprey...

编辑5:在SQL中使用DBI似乎非常快,我几乎确信这是一个DBIx::C问题。

共有1个答案

东方嘉木
2023-03-14

经过一些测试,我发现了问题:

当我使用DBIbind_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数据库驱动程序已更新。

 类似资料:
  • DBIx::Class 是一个Perl语言的数据库对象映射框架

  • 我是DBIx::Class的新手。我用它作为API从我的数据库中重新运行数据,我想用DBIC重新创建一个SELECT*from表。对于DBI,它对我很有效 返回数据“漂亮”的最佳方法是什么 我想以哈希数组的形式返回数据,如: 但是使用

  • linux下,提供了对于mysql的sql语法的解析器,示例代码: use DBIx::MyParse; my $parser = DBIx::MyParse->new(     database => 'database',     groups => ['my_cnf_group'],     options => ['--skip-networking'],     datadir => '

  • connect_info文档: 连接信息 这个方法通常由DBIx::Class::Schema中的“connection”调用,它在将参数列表传递到这里之前将其封装在arrayref中。 参数列表可能包含: > 在DBI中通常传递给“连接”的相同的4元素参数集,可选地后面跟着DBIx::Class识别的额外属性: 一个单独的代码引用,返回一个连接的DBI数据库句柄,可选地后跟DBIx::Class

  • 问题内容: 我正在使用Java远程方法调用(RMI)测试Web应用程序。当我通过加密狗,宽带连接到Internet时;RMI需要很长时间才能响应请求。完成方法调用大约需要10秒钟。我还可以看到,一旦进行方法调用,互联网连接中的数据传输速率就会提高。因此,显然,它似乎正在通过外部网络在两个内部进程之间建立RMI连接。 与互联网断开连接后,它的响应变化很快,例如几毫秒。我的/ etc / hosts文

  • 我不熟悉vertx和RxJava。我正在尝试实现一个简单的测试程序。然而,我无法理解这个项目的动态。为什么有些请求需要10秒钟以上才能响应? 下面是我的示例测试应用程序 我想知道的是,是什么让我的响应时间变慢了?