Perl 类联接生成大量select语句

Perl 类联接生成大量select语句,perl,join,dbix-class,prefetch,Perl,Join,Dbix Class,Prefetch,我注意到,当我在DBIx::类中的select中进行连接时,结果会得到大量select语句。例如,我有一个如下查询: my $testSetRs = $db->resultset('Testset')->search( {%searchCriteria}, { prefetch => [ { 'ax_group_testsets' => {'ax_group' => 'ax_

我注意到,当我在DBIx::类中的select中进行连接时,结果会得到大量select语句。例如,我有一个如下查询:

 my $testSetRs = $db->resultset('Testset')->search(
    {%searchCriteria},
    {
        prefetch  => [
            {
                'ax_group_testsets' => {'ax_group' => 'ax_user_groups'},
            },
            {'ax_user_testsets'  => 'ax_user'},
        ],
        '+columns' => [
            {
                'me.ax_group_testsets.ax_group_id'     => 'ax_group_testsets.ax_group_id',
                'me.ax_group_testsets.ax_group.public' => 'ax_group.public',
                'me.ax_group_testsets.ax_group.name'   => 'ax_group.name',
            },
        ],
        collapse => 1,
        group_by => ['me.ts_id', 'me.ts_name'],
        cache    => 1,
    }
);
生成:

SELECT me.ts_id, me.ts_name 
FROM testset me 
LEFT JOIN ax_group_testset ax_group_testsets ON ax_group_testsets.ts_id = me.ts_id 
LEFT JOIN ax_group ax_group ON ax_group.ax_group_id = ax_group_testsets.ax_group_id 
LEFT JOIN ax_user_group ax_user_groups ON ax_user_groups.ax_group_id = ax_group.ax_group_id 
LEFT JOIN ax_user_testset ax_user_testsets ON ax_user_testsets.ts_id = me.ts_id 
LEFT JOIN ax_user ax_user ON ax_user.ax_user_id = ax_user_testsets.ax_user_id 
WHERE ( ( ax_user.ax_user_id = ? OR ax_user_groups.ax_user_id = ? ) ) 
GROUP BY me.ts_id, me.ts_name: '349', '349'

SELECT me.ax_group_id, ax_group.public, ax_group.name FROM ax_group_testset me  JOIN ax_group ax_group ON ax_group.ax_group_id = me.ax_group_id WHERE ( me.ts_id = ? ): '4476'

SELECT me.ax_group_id, ax_group.public, ax_group.name FROM ax_group_testset me  JOIN ax_group ax_group ON ax_group.ax_group_id = me.ax_group_id WHERE ( me.ts_id = ? ): '4566'

SELECT me.ax_group_id, ax_group.public, ax_group.name FROM ax_group_testset me  JOIN ax_group ax_group ON ax_group.ax_group_id = me.ax_group_id WHERE ( me.ts_id = ? ): '4701'
等等

第一个选择,我要。这之后发生的事让我很烦恼。每组(40岁以上)一个。这发生在我所有的连接上,如果查询正确,可以跳到数百个。为什么会生成这么多查询?我能做些什么


我正在运行Perl ActiveState 5.16和DBIx.08250。

您的答案在于预取atribute,如和文档中所述

并且,假设您想要所有三个相关的记录列:

  '+columns' => [ 
          { 
             'me.ax_group_testsets.ax_group_id'     => 'ax_group_testsets.ax_group_id',
             'me.ax_group_testsets.ax_group.public' => 'ax_group.public',
             'me.ax_group_testsets.ax_group.name'   => 'ax_group.name',
          },
      ],
   collapse => 1,

到查询属性散列。

我想这里应该有一个解释。我希望
prefetch
会增加
SELECT
语句的数量,而不是减少。谢谢您的回复。据我所知,预回迁只是进行连接的另一种方式。我将查询修改为使用预回迁而不是联接,结果是一样的。我得到每个组的主查询,后跟select语句。@Borodin,预回迁使用主select获取额外数据,而不是等待您显式请求。因此,如果您只需要1%的相关行,这将是浪费。因为您使用的是“columns”属性,所以您还需要在“+columns”属性中包含来自ax_gorup_testset的列。这样,这些列将被预取。按原样,因为在第一次查询中没有提到它们,所以它们不会被检索并与主表数据一起缓存,所以DBIC必须返回它们。@Borodin预取会导致相关表中所需的列包含(并返回)在ResultSet的select中,无需对结果中的每一行进行后续数据库查询。这被称为进行1+N查询,并且永远不会比进行1次查询更可取。您确定其他SELECT语句不是在第一次SELECT之后执行的代码产生的吗?看起来可疑的是选择了与初始查询无关的
ax_group.public
  '+columns' => [ 
          { 
             'me.ax_group_testsets.ax_group_id'     => 'ax_group_testsets.ax_group_id',
             'me.ax_group_testsets.ax_group.public' => 'ax_group.public',
             'me.ax_group_testsets.ax_group.name'   => 'ax_group.name',
          },
      ],
   collapse => 1,