是否使用COALESCE会降低查询性能

Run*_*bit 6 sql-server

我只是很想知道使用COALESCE会降低查询性能.我在一篇文章中读到它,我们应该避免使用COALESE而不是它,我们应该使用案例.关于COALESE它是否真的存在阻碍查询性能的问题?任何帮助将不胜感激.

谢谢

Tom*_*más 6

我不能确定 SQL Server 的情况。不过,我会给出我在 Oracle 中的经验,以防可能存在相关性。这取决于您使用它的上下文。例如,考虑以下情况:您的 SQL 语句中可能有一个谓词,如下所示:

SELECT UserId, FirstName, Surname,  DepartmentId
FROM Users
WHERE DepartmentId = COALESCE(pDepartmentId,DepartmentId)
Run Code Online (Sandbox Code Playgroud)

在这种情况下(至少在 Oracle 中 - 是的,我意识到这是一个 SQL Server 问题)使用 COALESCE 将排除在 DepartmentId 上使用任何索引。

正如我所说,这取决于上下文,尽管这是从 Oracle 的角度来看,但我怀疑这同样适用于 SQL Server。

编辑

我刚刚看到你的帖子,关于你使用它的上下文,它与上面的完全一样。

在你的情况下你可以尝试以下方法,这是我学到的一个巧妙的技巧,可以避免这个问题 - 再次 - Oracle 但可以为你工作。

SELECT UserId, FirstName, Surname,  DepartmentId
FROM Users
WHERE pDepartmentId IS NOT NULL AND DepartmentId = pDepartmentId

UNION ALL

SELECT UserId, FirstName, Surname,  DepartmentId
FROM Users
WHERE pDepartmentId IS NULL
Run Code Online (Sandbox Code Playgroud)

抱歉打扰了 SQL Server 帖子,但如果这对您有帮助,那么它可能是值得的。

最终编辑

正如我在下面评论的那样,CASE 声明确实解决了这个问题。因此,不需要过于复杂的 UNION hack(顺便说一句,它的成本与 CASE 相同)。不幸的是,我仍然需要在 Oracle 中使用它。MSSQL 案例的又一次胜利(没有双关语!!)


Run*_*bit 0

我\xe2\x80\x99m 当前正在检查执行最频繁的程序,并查看平均持续时间较高的程序。我看到很多情况下,我们在 WHERE 子句中使用带有 COALESCE 的可选参数,如下所示:\nWHERE Schedule.CustNum = COALESCE(@CustNum, Schedule.CustNum)

\n\n

这些过程本质上运行速度很慢。当它们\xe2\x80\x99重新编译时,COALESCE会抛出编译器,并最终使用扫描整个表的计划。随着我们的卷的增长,我们\xe2\x80\x99 的表越来越大,这已成为一个更大的问题,在某些情况下,我们最终会得到一个在\xe2\ 时需要运行 10 秒以上的过程。如果未使用可选参数,x80\x99d 几乎立即运行

\n