sql-server - 表值函数从 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
解决方案
谢谢大家。似乎我犯了一个错误,因为当我认为它是 110 时,我已经将兼容性级别设置为 140。所以,我最初的困惑是,在旧级别的行为怎么会如此糟糕。我把它移回了 110,现在事情是可以预测的。tvf 从来都不是很好,但在 140 时,它太可怕了。我们有很多工作要做。
推荐阅读
- c# - 检查登录 ASP.NET Core 上的加密密码
- arrays - ngFor 在单击时获取数据并将其显示在单击的元素下
- xamarin.forms - Xamarin.Forms - iOS 应用程序在启动后崩溃
- r - 可视化回归的回归系数
- haskell - Haskell RIO monad 在持久化池中
- node.js - Socket.io - 会话管理的每个套接字事件的身份验证
- javascript - 如何在粘贴后(而不是在粘贴之前)添加对状态生效的EventListener?
- javascript - NodeJS Bcrypt 哈希和比较平均需要 2-3 秒。如何优化它
- substrate - 元数据生成失败,退出代码无
- javascript - 从 localStorage 中删除记录时刷新变量