【发布时间】:2016-12-21 08:33:50
【问题描述】:
我有一种情况,一个看起来相当简单的 select 语句需要几分钟才能完成;这个语句看起来像:
SELECT *
FROM MyView
WHERE MyFunction(Col_1, Col_2, Col_3, Col_4) = 1
AND Col_8 = 20
;
现在,时间分布(大致)为 select 的 1/3 和 MyFunction 调用的 2/3(通过简单地注释函数调用并与完整的 select 时间进行比较来衡量)。
现在,仅第二个条件(即Col_8 = 20)已经减少了记录数。
我尝试运行相同的查询两次,首先调用函数,然后调用它,两者都返回相同的值(当然)但也花费了相同的时间。
我想知道如果第一个条件已经失败,如何阻止函数的调用,并想到了两个替代方案:
将第一个条件设置为
Col_8 = 20,将第二个条件设置为第一个条件的CASE(即如果第一个条件失败返回FALSE,否则调用该函数),将查询构建为选择中的选择。
最好的(出于可能的原因!)将是在某些编程语言中(Ada 是第一个出现的),您可以在其中编写如下内容:
<condition 1> AND THEN <condition 2>...
【问题讨论】:
-
如果你在
col_8上添加一个索引,执行时间应该减少到函数需要的时间 -
看起来您正在使用标量值函数。您是否知道 SVF 是魔鬼,并且在几乎所有情况下使用内联表值函数 (TVF) 都是一个更好的主意?
-
谢谢@juergend。至于名字,当然是为了问题。真正的数据库有更有意义的名称。作为 fod 索引,假设 view 是给定的并且不能更改。
-
CASE方法是(大部分)保证的唯一方法。 “将查询构建为选择中的选择。”不能保证,因为 SQL Server 可以推送谓词。 -
向我们展示视图定义及其表和索引。
标签: sql sql-server performance