EF Core 和 SSMS 之间的性能参差不齐

问题描述 投票:0回答:1

我正在使用 EF Core 在大型 SQL Server 数据库上运行参数化“SELECT”查询。 当从 SQL Server Management Studio (SSMS) 运行完全相同的查询(具有相同的参数值)时,我观察到性能结果非常不均匀。

在最极端的情况下(取决于参数的值),从 SSMS 执行时性能提高了 2000 个数量级。 例如,从 SSMS 执行查询可能需要 10 毫秒,从 EF Core 执行则需要 20 秒。

  • 我正在使用 SQL Server Profiler 捕获 EF Core 生成的查询,复制文本而不对 SSMS 进行任何更改。
  • 性能也是通过 SQL Server Profiler 测量的。
  • 该查询有“TOP 10”子句,因此返回的数据量不会影响性能。

我的猜测是 SQL Server 在这两种情况下没有使用相同的查询计划。

  • 如何解释这种差异?
  • 是否有一些连接选项可能会影响查询计划的选择方式?
  • 我可以做些什么来更深入地调查这个问题?
sql sql-server entity-framework-core ssms
1个回答
0
投票

根据 @Sergey 和 @RossBush 的非常有价值的评论,我已经能够找到该行为的原因:

  • 由于 SQL 格式不同(额外空格),从 EF Core 和 SSMS 执行的查询未使用相同的查询计划。
  • 两种情况下构建查询计划时使用的参数值并不相同,这导致了截然不同的结果。

使用

dbcc freesystemcache('MyDbName')
清除缓存并使用相同的参数值从两侧运行查询后,我现在拥有完全相同的执行时间。

这个问题得到解决,我已经能够调整索引以提高整体性能。

© www.soinside.com 2019 - 2024. All rights reserved.