为什么一个T-SQL函数在同一台服务器上运行时会获得不同的性能,使用相同的表,但从不同的数据库实例调用它



我有以下情况,我有一台运行SQL server 2017的服务器,具有不同的数据库(DB1、DB2、DB3(,每个数据库都有不同的用途和不同的表。我在DB1中创建了一个名为DBFTN1的函数,它使用仅在DB1内分配的表。

当我在一个DB1实例上运行SSMS中的此函数时,结果是4秒,返回大约4K条记录,作为参考,我使用的命令类似于

SELECT * FROM DBFTN1('20220801');

当我使用DB2中的一个实例运行相同的函数时

SELECT * FROM DB1.DBFTN1('20220801');

大约4秒的结果是相似的,并且返回相同的记录。但当我从DB3运行相同的功能时,性能非常慢,第一条记录大约在25秒内出现,下载4k记录大约需要15分钟,使用的命令类似于

SELECT * FROM DB1.DBFTN1('20220801');

发生了什么,我如何在任何实例中获得类似的性能?

值得一提的是,当我运行测试时,服务器没有另一个进程在运行。

我尝试在DB3实例上运行以下语句,但结果仍然相同:

EXEC sp_updatestats
EXEC sp_msForEachTable @COMMAND1= 'DBCC DBREINDEX ( "?")';
CHECKPOINT 
DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE

提前感谢您的帮助。

如果没有UDF的完整代码,很难回答这样的问题。。。

请把完整的代码和所有的执行计划。SSMS中有一个工具可以比较两种不同的执行计划。

我怀疑您的数据库之间的配置参数存在一些差异。有两个级别的配置可以修改执行计划:

  • 数据库参数
  • 作用域数据库参数

只需通过一些查询查看这些值:

SELECT * FROM sys.databases;
SELECT "DB1" AS DBAME, * FROM DB1.sys.database_scoped_configurations
UNION ALL
SELECT "DB2" AS DBAME, * FROM DB1.sys.database_scoped_configurations
UNION ALL
SELECT "DB3" AS DBAME, * FROM DB1.sys.database_scoped_configurations;

最新更新