首页 > 解决方案 > 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')

最终,我在不更改任何代码的情况下删除并创建了该函数,并且查询运行得更快。以前,它不会在一分钟内完成,现在需要一秒钟。

当我删除并重新创建该函数时可能会发生什么变化?

标签: sqlsql-servertsqlsql-server-2014

解决方案


SQL Server 在第一次调用存储函数和存储过程时编译查询。优化器做出的决定是基于当时的表统计信息和参数。

这称为参数嗅探(我不喜欢该术语,因为决策基于参数和表统计信息)。

您的经验表明查询计划不是最理想的——这通常是基于散列的连接和嵌套循环连接之间的区别。有时,您可以通过使用索引来解决此问题。

另一个常见的解决方法是强制重新编译编程代码中的查询(或多个查询)。但是,这会产生重新编译的开销。对于需要一分钟才能运行的查询,这样的开销应该很小,但如果查询时间少于一秒,则更显着。


推荐阅读