首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强制SQL Server首先计算子查询

强制SQL Server首先计算子查询
EN

Stack Overflow用户
提问于 2014-04-09 05:57:12
回答 1查看 415关注 0票数 0

如何强制SQL Server首先计算子查询?

我的查询类似于:

代码语言:javascript
运行
复制
SELECT ObjectId FROM
(SELECT ObjectId FROM Table Where Id = @Id) T
WHERE fn_LongRunningFunction(T.ObjectId) = 1

我希望外部where子句对内部查询的结果求值。如何在不将子查询插入到临时表中的情况下执行此操作。

当我执行这个查询时,SQL会对查询求值,就好像它的代码是这样的:

代码语言:javascript
运行
复制
SELECT ObjectId FROM Table Where Id = @Id AND fn_LongRunningFunction(ObjectId) = 1

这不是我想要的。

EN

回答 1

Stack Overflow用户

发布于 2014-04-09 06:15:11

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

代码语言:javascript
运行
复制
SELECT ObjectId 
FROM Table 
Where Id = @Id
AND fn_LongRunningFunction(ObjectId) = 1

备注

在where子句中使用标量函数将导致全表扫描,因为sql server必须接触列中的每一行,并对ObjectId列值执行该函数,以计算它是否等于1。

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

例如,如果要根据给定值计算列的值,则在比较运算符的另一侧执行相反的操作,并在where子句中保留该列,例如,如果要在表中查找值

代码语言:javascript
运行
复制
WHERE ColumnName + 20 < 100 

你可以这样做,而不是这样做

代码语言:javascript
运行
复制
WHERE ColumnName < 100 -20 

在第一个示例中,sql server将不得不触摸每一行,并将其值加上20以与100进行比较,这将导致表扫描。

在第二个示例中,如果sql server在该列上有一个索引,它将简单地执行一次查找,以查看哪些值小于100 -20。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22948998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档