强制SQL Server首先评估子查询

时间:2014-04-08 21:57:12

标签: sql sql-server

如何强制SQL Server首先评估子查询?

我的查询类似于:

SELECT ObjectId FROM
(SELECT ObjectId FROM Table Where Id = @Id) T
WHERE fn_LongRunningFunction(T.ObjectId) = 1

我希望外部where子句评估内部查询的结果。如果不将子查询插入临时表,我该怎么做呢。

当我执行此查询时,SQL会将查询评估为如下所示:

SELECT ObjectId FROM Table Where Id = @Id AND fn_LongRunningFunction(ObjectId) = 1

这不是我想要的。

1 个答案:

答案 0 :(得分:1)

为什么你甚至在这里使用子查询,你可以在这里简单地使用一个查询......

SELECT ObjectId 
FROM Table 
Where Id = @Id
AND fn_LongRunningFunction(ObjectId) = 1

注意

在where子句中使用标量函数将导致全表扫描,因为sql server必须触及列中的每一行并在ObjectId列值上执行函数以评估它是否等于1或不。

尽可能避免在列名的where子句中使用任何函数。

例如,如果您正在针对给定值评估列的值,请在比较运算符的另一侧执行相反操作,并将该列单独保留在where子句中,例如,如果要在表中查找值< / p>

WHERE ColumnName + 20 < 100 

而不是做你可以做像

这样的事情
WHERE ColumnName < 100 -20 

在第一个示例中,sql server必须触及每一行,并将其值加20以对其进行评估,这将导致表扫描。

在第二个例子中,如果sql server在该列上有索引,它将只是查找哪个值小于100 -20。