我使用的是EF Core 6与SQL Server DB。有时,SELECT查询的执行时间超过30秒,并且超时。
如果我执行EF Core生成的完全相同的SQL(使用完全相同的参数,在相同的数据库上,在超时后几秒),所需时间不到一秒。
在整个周期内,DB服务器的CPU保持在〈30%。
在SQL Server Management Studio上运行SQL查询,我可以看到执行计划是理想的(即,它使用索引等)。
因此,我担心可能会有一些锁定阻止DB返回查询结果。
是否有办法指定EF Core,例如查询的隔离级别,或者甚至某些并发/锁定策略?
在我的特定场景中,有脏的或不完全最新的读取是可以的,因为我们有适当的过程来在后续的一轮查询中检索干净的数据。
谢谢
2条答案
按热度按时间gab6jxml1#
SQL Server何时会因为Parameter Sniffing而减慢查询速度已不是新问题。可以通过将参数转换为常量或在查询末尾添加OPTION(RECOMPILE)来解决此问题。此答案将
DbCommandInterceptor
添加到DbContextOptions
,并将OPTION(RECOMPILE)
提示追加到特定查询。配置数据库上下文
如何在查询中使用:
然后向SQL Server发送以下SQL语句:
和扩展的实现:
我已经把所有的东西都放进一个静态类中来简化答案。在EF Core 6上测试过,但也应该适用于较低的版本。
3zwjbxry2#
不建议重新编译,这可能会损害良好运行的应用程序。对于大规模数据,我个人建议使用DBQuery或Simple ADO.net