sql - DROP & CREATE FUNCTION 提高了性能
问题描述
我有一个在 WHERE 子句中使用多语句表值函数的查询,如下所示:
WHERE value IN (SELECT * FROM dbo.Split('SO',','))
该函数的返回值是一个带有单个单元格的表格,“SO”
我发现没有该功能的查询要快得多:
WHERE value = 'SO'
WHERE value IN ('SO')
WHERE value IN (SELECT 'SO')
最终,我在不更改任何代码的情况下删除并创建了该函数,并且查询运行得更快。以前,它不会在一分钟内完成,现在需要一秒钟。
当我删除并重新创建该函数时可能会发生什么变化?
解决方案
SQL Server 在第一次调用存储函数和存储过程时编译查询。优化器做出的决定是基于当时的表统计信息和参数。
这称为参数嗅探(我不喜欢该术语,因为决策基于参数和表统计信息)。
您的经验表明查询计划不是最理想的——这通常是基于散列的连接和嵌套循环连接之间的区别。有时,您可以通过使用索引来解决此问题。
另一个常见的解决方法是强制重新编译编程代码中的查询(或多个查询)。但是,这会产生重新编译的开销。对于需要一分钟才能运行的查询,这样的开销应该很小,但如果查询时间少于一秒,则更显着。
推荐阅读
- c++ - 如何使用 C++ 中的给定信息计算单身或已婚人士的税款
- visual-studio-code - 如何防止 VSCode 自动添加新行和缩进
- python-3.x - KeyError: 'axes.color_cycle 不是有效的 rc 参数(有关有效参数的列表,请参见 rcParams.keys())'
- php - 为什么 PHP 的 REQUEST 和 GET 会突然停止工作?
- javascript - 范围从 n 在两个方向
- javascript - 映射单选选项未按预期工作
- arrays - 合并列中的两个或多个“列表”?
- python - 无法点击下一页进行网页抓取
- d3.js - 传单中的缩放切换控件?
- javascript - 我在将 res 对象传递给我的 jQuery 函数时遇到问题。从浏览器到 mongoDB 再返回