SQL Server下SQL语句在代码中执行效率远低于在SSMS下的一个可能原因
背景:
一条SQL语句,在SSMS工具下执行,响应时间非常快,但在代码中发现执行效率却很慢。
分析:
通过SQL Profiler等工具监控会发现,语句执行不光时间超过预期,并且读取的成本非常高。将SQL语句放到SSMS工具后,查看执行计划并不存在索引缺少问题,IO的统计信息也明显低于在SQL Profiler监控的结果。
由于语句相同,只是执行的端的差异,怀疑是某个数据库的属性设置,引发执行语句时的环境变量不一致的原因,检查执行时的上下文发现ARITHABORT是存在差异的。SSMS下为开启的,但数据库上为关闭的。
SSMS中的设置
数据库属性设置
解决方式:
将数据属性中的【算术中止已启用】设置为true后问题得到解决。
或者通过脚本实现:
USE [master]
GO
ALTER DATABASE 数据库名 SET ARITHABORT ON WITH NO_WAIT
GO
由于星空产品开始版本始于SQL SERVER 2008,其默认的数据兼容级别为80,如果有类似的问题,需要将上述属性打开来解决问题。
参考:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-arithabort-transact-sql?view=sql-server-ver15
ARITHABORT
更新记录:
2023.11.2:调整数据库属性设置部分,在实际情况下,当把ANSI_WARNINGS设置为TRUE后,在数据库兼容级别>=90模式时,存在不会如官方所说将ARITHABORT也设置为TRUE的情况。所以修改为直接开启ARITHABORT。
SQL Server下SQL语句在代码中执行效率远低于在SSMS下的一个可能原因
本文2024-09-23 01:17:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-144958.html