Question

J'ai entendu d'un podcast qu'il n'y a pas ORM qui ont une bonne solution pour la réutilisation des plans d'exécution. Elle conduira à une augmentation de cache de plan d'exécution qui affecte les performances.

  • Comment plan d'exécution de la poignée NHibernate?
  • sont-plan d'exécution dans NHibernate réutilisé?
Était-ce utile?

La solution

Pour répondre à votre première question, NHibernate ne gère pas les plans d'exécution. SQL Server gère les plans d'exécution. Si le SQL dynamique produit par NHibernate est paramétrés, les plans seront classés comme « préparés » et seront réutilisés en supposant que les paramètres fournis dans chaque exécution ultérieure pourrait produire le même plan de requête optimisé. Si le SQL dynamique n'est pas paramétré, le plan d'exécution sera classé comme « Adhoc » et pourrait être réutilisés encore.

J'utilise ce bit de T-SQL pour surveiller la taille des caches pour les différents plans de requête. Je crois que je copiais ce à partir du site de Paul Randal (http://www.sqlskills.com/BLOGS/PAUL/), mais il a été si longtemps que je ne sais plus sûr.

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

Autres conseils

ORM ne sont généralement pas le problème eux-mêmes, il est la façon dont ils sont utilisés. SQL Server génère le plan d'exécution. NHibernate peut générer une requête SQL qui provoque pour générer un mauvais plan d'exécution. Si vous utilisez des variables dans vos requêtes, puis les plans d'exécution peuvent être réutilisés. concaténation de chaîne empêche généralement la réutilisation des plans. Voir cette question pour plus d'informations.

Outre la question de paramétrisation qui a déjà été mentionné, tous les ORM peuvent causer des plans vraiment merdiques à générer. Cela se fait le plus souvent quand il y a beaucoup d'options de recherche provoquant une très grande clause WHERE dans la requête SQL Server qui est plein de OU déclarations que le SQL Server ne peut pas faire beaucoup avec.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top