NHibernate Profiler mostra un sacco di messaggi di errore sul piano di query:formati differenti parametri risultano nella cache piano di query inefficienti
formati differenti parametri determinano l'utilizzo della cache inefficiente piano di query
Esso conduce anche ad un spiegazione in http://nhprof.com/Learn/Alerts/UncachedQueryPlan e ti avverte sull'uso del parametro durante la creazione della sessione. Lo faccio in modo fluente:
.ExposeConfiguration(configuration => configuration
.SetProperty("current_session_context_class", "thread_static")
.SetProperty("prepare_sql", "true")
.SetProperty("generate_statistics", "true")
)
Ma sembra che non funzioni perché i messaggi di errore sono ancora lì. È una limitazione su OracleClientConfiguration o sto sbagliando?
Modifica Per fornire qualche informazione in più su questo ...
Nel mio repository faccio questo
session.Query<TEntity>.Where(predicate).ToList();
e questa è la chiamata
var value = ParameterRepository.First(p => (p.Pipeline.Id == pipelineId && p.Name == name));
Ad esempio quelli sono due SQL generati da questa chiamata e quel profiler Nhibernate mostra come "Le dimensioni dei parametri DIFFERENTI portano a un piano di query inefficiente età"
select GUID1_12_,
PARAMETER2_12_,
PARAMETER3_12_,
GUID4_12_
from (select pipelineex0_.GUID_PIPELINE_EXEC_PARAMETER as GUID1_12_,
pipelineex0_.PARAMETER_NAME as PARAMETER2_12_,
pipelineex0_.PARAMETER_VALUE as PARAMETER3_12_,
pipelineex0_.GUID_PIPELINE_TRACKING as GUID4_12_
from FCT_PIPELINE_EXEC_PARAMETER pipelineex0_
where pipelineex0_.GUID_PIPELINE_TRACKING = 'A5916E73CF1E406DA26F65C24BFBF694' /* :p0 */
and pipelineex0_.PARAMETER_NAME = 'lid' /* :p1 */)
where rownum <= 1 /* :p2 */
e la seconda
select GUID1_12_,
PARAMETER2_12_,
PARAMETER3_12_,
GUID4_12_
from (select pipelineex0_.GUID_PIPELINE_EXEC_PARAMETER as GUID1_12_,
pipelineex0_.PARAMETER_NAME as PARAMETER2_12_,
pipelineex0_.PARAMETER_VALUE as PARAMETER3_12_,
pipelineex0_.GUID_PIPELINE_TRACKING as GUID4_12_
from FCT_PIPELINE_EXEC_PARAMETER pipelineex0_
where pipelineex0_.GUID_PIPELINE_TRACKING = 'A5916E73CF1E406DA26F65C24BFBF694' /* :p0 */
and pipelineex0_.PARAMETER_NAME = 'period' /* :p1 */)
where rownum <= 1 /* :p2 */
IMHO è questo PARAMETER_NAME con 'coperchio' e 'periodo' che sta generando diversi piani di query.
grazie in anticipo
quindi quali sono i diversi piani di esecuzione di Oracle? – steve
Ora non rughetto come è il piano di query di Oracle, ma lo scenario è abbastanza simile a [quello evidenziato nella descrizione di ayende del problema] (http://nhprof.com/Learn/Alerts/UncachedQueryPlan). In breve si dice che il nibbato deve essere confidato per eseguire querie in un piano di ricerca amichevole _ e, da quello che vedo io non funziona. – guillem
beh, mi sento di raccomandare un approccio più analitico, altrimenti si tratta di tentativi ed errori. Quali sono gli errori? – steve