很不幸,“ORM”和“性能问题”常常一起出现。ORM 通过对开发人员隐藏 SQL 细节可以大大的提高生产力。然而,它们很容易产生一些未被发现的荒谬查询。通常情况下,数据库管理员可以通过交叉引用有问题的存储过程来查找问题代码。但是,ORM 依赖于动态生成的 SQL,便很难这么做了。所以,我们要寻找一些更有效的 ORM 分析工具。
NHibernate
NHibernate 分析器(NHProf)是我们期待的入门级产品。除了有完整的统计信息外,它还显示了最近完整的 SQL 调用列表,并使用堆栈来反向跟踪调用它的代码。NHProf 的界面简洁并有加强的交叉引用功能,它能很轻松地从针对个别查询语句的检查,切换到该代码块所使用到的全部查询语句。
NHibernate 分析器最重要的部分是预警功能。一些警报会显示当前数据库错误所产生的问题,或者在多个线程中使用同一个会话等意外情况。其他警报则会显示潜在的问题,比如本该批量操作的场景被拆分成大量单独执行的写操作。还有一些警告用来提示随后可能出现的问题,比如未绑定结果集。
未绑定结果集即已执行查询但未明确使用 NHibernate 的 SetMaxResults() 抑或 SQL 的 TOP 和 LIMIT 语句来限定的返回记录。通常,这意味者应用程序假设该查询总是返回少量记录。在开发和测试过程中,这种做法很有效,但是,在生产环节中却是一个定时炸弹。
NHibernate 分析器的另一面就是它的植入性。你不可以附加到一个正在运行的进程,必需提前配置好。虽然 NHibernate 分析器建议直接引用在你的程序中,log4net 用户也可以通过设置 app.config 来激活该分析。
NHibernate Profiler 是一个商业产品,起始价格是每用户 300 美元。
LINQ to SQL
开发人员在查找 LINQ to SQL 问题时,第一个便会想到去观察 DataContext 日志。DataContext 对象有 Log 属性,它会将所有 SQL 路径输出至我们指定的 TextWriter。这种做法简单且自由,但是对大量原生 SQL 进行处理是否适合于关键性应用仍旧是个疑问。
LINQ to SQL 分析器(L2SProf) 和 NHibernate 分析器由同一家公司出品,它们工作的方式比较类似。除了实时分析以外,我们可以配置它来写入日志文件作为后期分析。和 NHProf 相同,它的价格是每位用户 300 美元。当前它还处于 Beta 阶段。
Huagati 查询分析器是另外一种植入式分析器。他们直白道:“这些运行时组件的设计目标,便是集成至使用 Linq-to-SQL,或 LLBLGen Pro 来访问 SQL Server 的应用程序,并和他们一起部署。幸运的是,在运行的时候可以根据需要打开或关闭分析器。
Huagati 的用户界面已经明显过时,占据半个显示器大小的表格显示着 SQL 语句和跟踪堆栈。它缺乏 NHProf/ L2SProf 的几乎所有优点,比如:预警和摘要显示,但它有一项面向专业开发人员的强大功能,即细节。
Huagati 分析器不仅提供绝对的持续时间和行数,它深入挖掘 SQL Server 的所有可用信息。除了往返时间,我们还可以看到其他一些有价值的信息,比如:对一个查询进行编译及执行的时间对比。你甚至可以看到真实的执行计划及 I/O 状况。
Huagati 查询分析器是一款商业产品,限制版的价格是 50 美元,完整版的价格是每位用户 120 美元。
ADO.NET Entity Framework
无话可说。首先,你无法像在 LINQ to SQL 那样获取到即便是最基本的 SQL 日志记录。因此,似乎没有人在为它编写分析器。
结论
还有很多.NET 的 ORM 框架,但是它们的情况和 ADO.NET Entity Framework 十分类似。除了这里提到的两款分析工具外,几乎没有什么框架提供了这方面的支持——除非你使用数据库内置的分析器。
评论