首页 > 解决方案 > 表值函数从 2012 年迁移到 sql 2017 后性能下降

问题描述

一个月前从 2012 年迁移到 2017 年(测试似乎还可以,但测试不严格)。一个月后,我注意到以一系列常用表表达式开头的表值函数需要很长时间才能执行或根本不执行。我可以重写代码(第 3 方应用程序以及我们自己的自定义代码并排......哎哟)。我今天注意到的是一个查询在 SQL2012 服务器上运行良好(我仍然可以访问它)并且完全在 SQL2017 上出去吃午饭。我认为这可能会发生并保留所有数据库的兼容性设置。有没有人遇到过这个?

我玩过 9481,但据我所知,使用 Comp Level 110,这甚至应该不是问题。是否有任何其他服务器设置我可以设置以强制它表现得像它那样处理问题(有很多)一个接一个。

此外,因为这些 tvf 表在任何地方都被重用和引用,所以它们保持原样很重要。我不能过多地重新布置家具。开发人员同时利用了 TVF 和 CTE。

一个月前从 2012 年迁移到 2017 年,兼容性保持不变。模式已开发,其中查询:

Select t1.Col1
t1.Col2,t2.Col8,
tvfTable1.Col10, etc...
FROM table1 t1 join table2 t2 on t1.key=t2.foreignkey
CROSS APPLY (t1.Col1,t2,col4,0,1,2,3) tvfTable1

TVF的一切似乎都始于:

...
AS RETURN (
WITH CTE1 AS (query),
CTE2 AS (query referencing CTE1)
...
SELECT MANYColumns
FROM MANYTABLES JOIN CTE4 on mt.key=cte4.key

标签: sql-servertsqluser-defined-functionscommon-table-expression

解决方案


谢谢大家。似乎我犯了一个错误,因为当我认为它是 110 时,我已经将兼容性级别设置为 140。所以,我最初的困惑是,在旧级别的行为怎么会如此糟糕。我把它移回了 110,现在事情是可以预测的。tvf 从来都不是很好,但在 140 时,它太可怕了。我们有很多工作要做。


推荐阅读