【发布时间】:2021-05-02 08:56:25
【问题描述】:
我有一个在 where 子句中使用标量值函数的 sql 查询。
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = fn_ScalarValueFunction(100)
ORDER BY T.SomeDate
执行查询大约需要 1 分钟。但是,如果我单独运行以下查询,它们会在一秒钟内运行。
SELECT fn_ScalarValueFunction(100) = 123
SELECT TOP 1 *
FROM TableName T
WHERE T.SomeID = 123
ORDER BY T.SomeDate
我检查了执行计划,它对两个查询进行了全表扫描。
如何提高慢查询的性能?
【问题讨论】:
-
如果您不在 SQL Server 2019(+) 中,则该函数无法从内联中受益。因此,使用内联表值函数可能会更好。
-
多行标量函数可以慢(我们这里没有定义,所以不可能知道)。转换为 内联 表值函数可以(可能)带来性能优势。
-
where子句中使用标量值函数的问题已经讨论过很多次了。稍微搜索一下 - 但这是一个众所周知的性能问题。也许你应该问自己的第一个问题是你的函数是否真的有用并且真的需要。许多缺乏经验的编码人员过于喜欢将 tsql 模块化,这会导致这样的问题。
-
事实上,如果 SQL Server 针对表中的 每一 行运行该函数,然后进行排序,我不会感到惊讶;因此为什么它这么慢。
-
那个实例是 2019 年吗?
标签: sql sql-server user-defined-functions sqlperformance