2011-09-14 2 views
0

내가 두 개체일대일 또는 다 대일 CF9 ORM 2에 따라서 나는 여러 homeFeatures이있는 각이있다

HomeFeatures 
<cfcomponent persistent="true"> 
    <cfproperty name="id" column="homeFeatureid"> 
    <cfproperty name="tabTitle"> 
    <cfproperty name="title"> 
    <cfproperty name="description"> 
    <cfproperty name="sort"> 
    <cfproperty name="moretext"> 
    <cfproperty name="url"> 
    <cfproperty name="active"> 
    <cfproperty name="media" fieldtype="many-to-one" fkcolumn="mediaid" cfc="media" lazy="false" fetch="join" missingrowIgnored="true"> 
</cfcomponent> 

그리고

Media 
<cfcomponent persistent="true" table="cms.dbo.media"> 
    <cfproperty name="id" column="mediaid"> 
    <cfproperty name="filename"> 
</cfcomponent> 

가 조회 그것과 관련된 미디어 항목. 동일한 미디어 항목이 여러 homeFeatures와 연관 될 수 있지만 각 homeFeature는 homeFeatures.mediaid로 연결된 하나의 미디어 항목 만 가질 수 있습니다.

엔티티로드 ("homeFeatures")를 수행하면 homeFeatures에 대한 쿼리 1 개와 모든 행의 homeFeatures에 대한 미디어 테이블에 대한 쿼리 1 개가 생성됩니다. 즉 이것은 N + 1 문제입니다. 왜? 이 값은 총 2 개의 쿼리 여야합니다. 하나는 모든 homeFeatures를 가져오고, 다른 하나는 homeFeatures에 의해 결정된 목록에있는 미디어 ID의 모든 미디어를 가져와야합니다. http://www.rupeshk.org/blog/index.php/2009/09/coldfusion-orm-performance-tuning-fetching-strategy/에 정의 된대로 "열망하는"로딩을 시도하고 있고 어도비 워드 프로세서에서 시도하고 있습니다.

이 특정보기에서는 모든 항목에 대한 미디어 레코드에 액세스해야하므로 lazy가 false로 설정된 이유입니다. 나는 lazy = false | true, batch = 999, fieldtype = one-to-one | many-to-one의 모든 반복을 시도했지만, fetch = join | select는 모두 똑같은 N + 1 문제를 발생시킨다.

아이디어가 있으십니까? 도와주세요!

+2

그래서'fetch = "join"'은 여전히 ​​자식 객체로부터 많은'SELECT'을 얻습니다. 객체를 변경 한 후에'ORMReload()'를 실행했는지 확인 했습니까? –

+0

이것은 디버그 플랫폼이므로'onRequestStart()'에'ormReload()'가 있습니다. 또한 각 부모 개체에 대해 select 문을 얻으므로 로그는'부모 DB 개체의 mediaid = (부모 mediaid) '파일을 각 부모 DB 행에 대해 한 번씩 반복하도록합니다. – Nucleon

+0

나는 내 iPad에있어 내일까지 답변을 얻을 수 없습니다. 단단히 매달 리고 비실용적 인 일은하지 마십시오. –

답변

0

이 경우 솔루션은 batchsize입니다. cfc 또는 cfproperty에 지정함으로써 batchsize를 설정하여 관련 항목을 개별적으로 그룹화하지 않고 그룹으로 배치 할 수 있습니다.