ORM 性能跟踪

6
这不是一个“哪个是最快的 ORM”问题,也不是关于“如何使用 ORM 编写优秀代码”的问题。这是另一个方面:代码已经编写好了,已经上线,数千个用户正在访问应用程序,但存在一个总体性能问题。SQL Profiler 跟踪只能运行短时间:5 分钟就会产生数十万条结果。
问题很简单:在使用 SQL Profiler 缩小了一些缓慢查询(持续时间大于给定时间)之后,有哪些技术和解决方案可用于将这些 SQL 查询追溯回到具有问题的组件?相关问题是,如果特定区域很慢,我们如何识别该区域执行的 SQL 以便在 SQL Profiler 中适当过滤?
背景是我们有一个相当复杂的表结构的大型应用程序,目前基于存储过程进行数据访问。如果出现 SQL 性能问题,则通常是使用 SQL Profiler,查找是否有任何缓慢的地方(按持续时间过滤)或者被投诉的区域很慢(按存储过程过滤),然后调整存储过程(或架构-通过索引)。
现在有一个推动,将我们的代码从主要的存储过程解决方案转移到主要的ORM解决方案,但是对移动的大力推动是如何追踪性能问题,如果出现问题,可以追溯到有问题的代码。我读了一些资料,似乎往往涉及第三方工具(ORM跟踪实用程序,如NHProf或.NET跟踪实用程序,如dottrace),我们需要在服务器上安装这些工具。现在是否可以在实时环境中安装其他工具是另一个问题,因此,如果可以在没有其他工具的情况下执行此类操作,则可能会有额外的奖励。
我主要对SQL Server 2008的解决方案感兴趣,但它可能足够普遍适用于任何RDBMS。至于ORM技术,在这方面我没有特定的重点,因为目前没有使用任何东西,所以很想听听nHibernate、fluent-nhibernate和Entity Framework之间的技术差异(或者是共同点)。其他ORM如果提供其他功能也是可以接受的 :-)
我已经阅读了如何找到和解决性能问题...,我认为问题仅仅在于其中的“隔离”部分。一个只在实际系统中容易重现的问题将会很难被隔离。我在第二段引用的数字是我们可以从配置文件中获取的数据类型...

如果你有ORM追踪实际经验,那就更好了:-)

更新,2016-10-21:为了完整起见,我们最终通过编写代码并覆盖NHibernate方法来解决了这个问题。有关完整详细信息,请参阅我提出的这个其他SO问题:NHibernate和拦截器-测量SQL往返时间。我相信这对许多不同的ORM都是一种类似的方法。


你是否已经熟悉了各种基于执行计划统计而非分析的DMV和报告,如按持续时间、CPU、IO等显示顶级查询的内容?另外,你使用的SQL Server版本是什么?如果是2008年版本,那么可能会有管理数据仓库来帮助你(尽管我猜测由ORM发出的非参数化查询可能会导致大量类似的查询和计划,从而使聚合结果变得困难)。 - Martin Smith
有趣的问题,我期待着学习关于这个主题的一些东西,因为我没有答案给你。 - HLGEM
@Martin ... 这就是问题所在 -- 如果改变查询的唯一方法是改变ORM代码,那我就卡住了 :-) 不过还是谢谢你提醒我;这肯定会节省一些头疼。 - Chris J
我们如何识别此区域正在执行的SQL,以便在SQL Profiler中适当地进行过滤?如果您想知道是否可以创建持续时间过滤器,则可以在SQL Profiler中实现,我理解得对吗? - Danil
@Danil... 我的问题是,一旦我确定了SQL语句,有哪些方法或工具可以将其追溯到最初发出调用的ORM组件?我使用SQL分析器没有问题--它是我SQL工具库中的强大工具。 - Chris J
显示剩余2条评论
2个回答

2

存在针对ORM工具的分析器,例如UberProf。它可以发现由ORM生成的可能存在问题的SQL语句。

例如select n+1问题。这些工具可能会提示您哪些ORM查询语句会导致较差的SQL代码,甚至可能会告诉您如何改进它们。


这样的工具在高负载的实时环境中有多好用(请参见问题中提到的数据量)?我假设使用这些工具,您可以找到以这种方式使用ORM的代码?此外,如果我们将应用程序部署在(比方说)六个应用服务器上,可能需要跟踪超过六个应用服务器(尽管我们可以在一个服务器上进行跟踪,并希望问题出现在那里,但它不能完全反映数据库上正在发生的情况--因此需要与SQL Profiler等工具一起使用?) - Chris J

0

我们有一个Java/Hibernate应用程序出现了问题,所以我们使用了不同的值来设置SET CONTEXT_INFO。如果我们在同一SPID上看到,比如0x14,在WTF查询之前,我们就可以将其缩小到模块x。

作为一个非Java人员,我不知道他们具体做了什么,当然这可能不适用于.net。如果我没记错的话,你必须小心连接何时打开/关闭。

此时我们还可以控制客户端负载,以便我们没有太多的无关流量。

当然,你的情况可能会有所不同,但这可能会有用。

我刚刚发现了这些,它们也可能会有用


有趣的方法;我一直想知道是否有一种方法可以“水印”SQL语句……也许这是一个需要进一步研究的方向。 - Chris J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接