5

以下のこの例では:

my $rs = $schema->resultset('CD')->search(
{
  'artist.name' => 'Bob Marley'
  'liner_notes.notes' => { 'like', '%some text%' },
},
{
  join     => [qw/ artist liner_notes /],
  order_by => [qw/ artist.name /],
}
);

DBIxクックブックには、これが生成されるSQLであると記載されています。

# Equivalent SQL:
# SELECT cd.*, artist.*, liner_notes.* FROM cd
# JOIN artist ON cd.artist = artist.id
# JOIN liner_notes ON cd.id = liner_notes.cd
# WHERE artist.name = 'Bob Marley'
# ORDER BY artist.name

しかし、クックブックの残りの部分から、もちろんプリフェッチが次のように使用されていない限り、クエリはcd。*のみを選択すると信じるようになりました。

my $rs = $schema->resultset('CD')->search(
{
  'artist.name' => 'Bob Marley'
  'liner_notes.notes' => { 'like', '%some text%' },
},
{
  join     => [qw/ artist liner_notes /],
  order_by => [qw/ artist.name /],
  prefetch => [qw/ artist liner_notes/],
}
);

以下は私がこれを信じるように導く声明です:

[Prefetch] allows you to fetch results from related tables in advance

私がここで欠けているものを誰かが私に説明できますか?か否か?どうもありがとう!

4

1 に答える 1

4

クックブックの前のセクションEquivalent SQLと矛盾し、エラーのように見えます。

結合は、クエリを実行し、フィルターと並べ替え条件を適用するときに、結合されたテーブルの列を使用しますが、結合されたテーブルの列は返しません。つまり、そうする場合は、そのステートメントを呼び出すたびに、アーティストの名前を取得するために$cd->artist->name追加の操作を行う必要があります。SELECT artist.* FROM artist WHERE artist.id = ?

プリフェッチは、プリフェッチテーブルからすべての列を選択するためにも使用されます。これらの列が実際に必要な場合は、プリフェッチを使用する方が効率的です。たとえば$cd->artist->name、追加のクエリを実行する必要がなくても実行できます。ただし、これらの列が必要ない場合は、そのデータをロードするための不要なパフォーマンスの低下が発生します。

于 2012-06-18T03:09:05.947 に答える