Perl 类联接生成大量select语句
我注意到,当我在DBIx::类中的select中进行连接时,结果会得到大量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_
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,