加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 为什么在SQL Server 2012中配置空功效的查询错误

发布时间:2021-03-22 20:26:01 所属栏目:编程 来源:网络整理
导读:在MS SQL Server 2012中运行以下查询时,第二个查询失败但不是第一个查询失败.另外,在没有where子句的环境下运行时,两个查询都将失败.我不知道为什么要么失败,由于两者都应该有空的功效集.任何辅佐/看法暗示赞赏. create table #temp(id int primary key)creat

在MS SQL Server 2012中运行以下查询时,第二个查询失败但不是第一个查询失败.另外,在没有where子句的环境下运行时,两个查询都将失败.我不知道为什么要么失败,由于两者都应该有空的功效集.任何辅佐/看法暗示赞赏.

create table #temp
(id     int primary key)

create table #temp2
(id     int)

select 1/0
from #temp
where id = 1

select 1/0
from #temp2
where id = 1

办理要领

起源相识执行打算表现表达式1/0在Compute Scalar运算符中界说:

此刻,纵然执行打算确其实最左边开始执行,迭代地挪用子迭代器上的Open和GetRow要领来返回功效,SQL Server 2005及更高版本包括一个优化,表达式凡是只由计较标量界说,行使evaluation deferred until a subsequent operation requires the result:

在这种环境下,仅在组装行以返回到客户端时才必要表达式功效(您可以将其视为在绿色SELECT图标处产生).按照该逻辑,耽误评估意味着永久不会评估表达式,由于两个打算都不会天生返回行.为了办理这一题目,Clustered Index Seek和Table Scan都没有返回一行,因此没有可以组装的行来返回客户端.

可是,有一个单独的优化,个中一些表达式可以标识为runtime constants,因此在查询执行开始之前评估一次.在这种环境下,可以在showplan XML(左侧的Clustered Index Seek打算,右侧的Table Scan打算)中找到已产生的指示:

我写了更多关于底层机制以及它们怎样影响机能的更多内容in this blog post.行使哪里提供的信息,我们可以修改第一个查询,以便在执行开始之前评估缓和存两个表达式:

select 1/0 * CONVERT(integer,@@DBTS)
from #temp
where id = 1

select 1/0
from #temp2
where id = 1

此刻,第一个打算还包括一个常量表达式引用,而且两个查询城市天生错误动静.第一个查询的XML包括:

更多信息:Compute Scalars,Expressions and Performance

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读