Domanda

Ho sentito da un podcast che non ci sono ORM che hanno una buona soluzione per il piano di esecuzione riutilizzo. Che porterà ad un aumento della cache piano di esecuzione che influisce sulle prestazioni.

  • Come funziona NHibernate piano di esecuzione maniglia?
  • piano di esecuzione riutilizzati in NHibernate?
È stato utile?

Soluzione

Per rispondere alla tua prima domanda, NHibernate non gestisce i piani di esecuzione. SQL Server gestisce i piani di esecuzione. Se viene parametrizzato SQL dinamico prodotto da NHibernate, i piani saranno classificati come "preparati" e saranno riutilizzati assumendo i parametri forniti in ogni successiva esecuzione potrebbe produrre lo stesso piano di query ottimizzata. Se l'SQL dinamico non è parametrizzato, il piano di esecuzione sarà classificato come "Adhoc" e potrebbero ancora essere riutilizzati.

Io uso questo po 'di T-SQL per monitorare le dimensioni della cache per i vari piani di query. Credo che ho copiato questo dal sito di Paul Randal (http://www.sqlskills.com/BLOGS/PAUL/), ma è stato così tanto tempo che non riesco più a sapere con certezza.

SELECT 
    objtype AS [CacheType],
    count_big(*) AS [Total Plans],
    sum(cast(size_in_bytes as decimal(12,2)))/1024/1024 AS [Total MBs],
    avg(usecounts) AS [Avg Use Count],
    sum(cast((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 AS [Total MBs - USE Count 1],
    sum(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [Total Plans - USE Count 1]
FROM sys.dm_exec_cached_plans
GROUP BY objtype
ORDER BY [Total MBs - USE Count 1] DESC;
GO

Altri suggerimenti

ORM non sono di solito il problema se stessi, è come vengono utilizzati. SQL Server genera il piano di esecuzione. NHibernate può generare una query SQL che causa per generare un piano di esecuzione male. Se si utilizzano le variabili nelle query, poi piani di esecuzione possono essere riutilizzati. Stringa concatenazione impedisce solitamente piano di riutilizzo. Vedere questa domanda per maggiori informazioni.

Oltre alla questione parametrizzazione che è stato già detto, tutti i ORM possono causare piani davvero scadente da generare. Questo viene fatto più spesso quando ci sono un sacco di opzioni di ricerca provocando una molto grande clausola WHERE nella query SQL Server che è piena di O dichiarazioni che lo SQL Server non può fare un bel po 'con.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top