bla*_*ter 6 sql sql-server nhibernate
我们的应用程序发出NHibernate生成的SQL查询.在应用程序运行时,查询大约需要12秒才能对SQL Server数据库运行.SQL事件探查器显示超过500,000个读取.
但是,如果我使用SQL事件探查器捕获确切的查询文本,并从SQL Studio再次运行它,则需要5秒钟,并显示少于4,600次读取.
该查询使用了几个参数,其值在SQL文本的末尾提供,我读了一些关于参数嗅探和低效查询计划的内容,但我认为这与存储过程有关.也许NHibernate在实例化其实体时保持结果集打开,这可以解释更长的持续时间,但是什么可以解释为NHIBnate执行的相同查询的额外494,000"读取"?(SQL事件探查器跟踪中不会显示其他查询.)
使用NHibernate 3.1的LINQ工具将查询指定为LINQ查询.我没有包含查询本身,因为它似乎是一个哲学的基本问题:什么可以解释这种戏剧性的差异?
如果它是相关的,结果中也恰好有一个varbinary(max)列,但在我们的情况下它总是包含null.
任何见解都非常感谢!
请务必阅读:http://www.sommarskog.se/query-plan-mysteries.html
相同的规则适用于 procs 和 sp_executesql。粗制滥造的计划的一个重要原因可能是传递nvarchar字段的参数varchar,它会导致索引扫描而不是搜索。
我非常怀疑输出是否影响这里的性能,这可能是发送的参数之一或基础表的选择性的问题。
当测试探查器的输出时,请务必包含sp_executesql并确保您的设置匹配(例如SET ARITHABORT),否则将导致生成新计划。
您始终可以通过以下方式从执行缓存中挖掘出伪劣计划sys.dm_exec_query_stats
| 归档时间: |
|
| 查看次数: |
1742 次 |
| 最近记录: |