如何强制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
这不是我想要的。
答案 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。