0

我正在使用DBIx::Class::ResultSet来查询项目并对我的数据进行分页。这是我使用的查询:

my $clients = $c->model('DB::User')->search(
    { active_yn => 'y', client_yn => 'y' },
    {   
        columns => [qw/id first_name last_name username email/],
        order_by => ['last_name'],
        page     => ($c->req->param('page') || 1), 
        rows     => 20,
    }   
); 

有一次,我得到了结果集,我循环遍历Template::Toolkit中的结果,如下所示:

[% WHILE (client = clients.next) %]
    <tr>
        <td>[% client.first_name %] [% client.last_name %]</td>
    </tr>
[% END %]

我的问题是,每次我打电话都会next发出一个新的查询吗?我不清楚,因为all方法说它返回集合中的所有元素,那么第一个查询不这样做吗?我想尽可能高效。谢谢!

4

2 回答 2

2

next答案是否定的:只要您使用相同的结果集实例,它就不会在您每次调用时执行新查询。它旨在成为一种快速迭代记录的方法。

于 2013-06-07T06:18:41.013 回答
0

搜索返回标量的 ResultSet 对象和列表上下文中的 Result 对象列表。您可以使用 search_rs 强制返回 ResultSet。

如果您的数据库支持,Next 将使用游标,但每次调用仅获取一行并从中构造 Result 对象。

如果行数较少,则执行单个 SQL 查询并一次构造所有 Result 对象会更快。分页时通常是这种情况。

当构建所有 Results 对象的内存量太大时,Next 是有意义的,例如在导出数百万行时。

于 2013-06-07T17:18:48.847 回答