2012-06-18 4 views
5

:DBIx :: 클래스 예를 들어 아래의 예에서

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 cookbook이 생성 될 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 

그러나 요리 책의 나머지

, I '쿼리가 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

Equivalent SQL은 요리 책의 previous section과 모순되며 오류로 보입니다.

조인은 조인을 수행하고 필터 및 정렬 조건을 적용 할 때 조인 된 테이블의 열을 사용하지만 조인 된 테이블의 열은 반환하지 않습니다. 즉, $cd->artist->name을 수행하면 SELECT artist.* FROM artist WHERE artist.id = ?을 추가로 입력해야 번을 번으로 부르면됩니다.

프리 페치는 프리 페치 테이블의 모든 열을 선택하는 데에도 사용됩니다. 이러한 열이 실제로 필요할 때 프리 페치를 사용하는 것이 더 효율적입니다 (예 : 따라서 추가 쿼리를 수행하지 않아도 $cd->artist->name을 수행 할 수 있습니다. 그러나 이러한 열이 필요하지 않은 경우 해당 데이터를로드 할 때 불필요한 성능 저하가 발생합니다.

+0

위 예제에서 sql은 "SELECT cd. *"로 변경됩니다. 동등한 sql에 대해 – srchulo

+1

- 맞습니다. – stevenl