sql-server – 为什么在SQL Server 2012中设置空结果的查询错误
|
在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 (编辑:均轻资讯网_我爱站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- HTML Table 空白单元格补全的实现方法
- sql – 如何将具有公共列(A,B)和(A,C)的2个查询转换为一个(
- sql-server – SQL Server游标参考(语法等)
- data-structures – 关系数据库的高效持久数据结构
- sql-server – 为什么SQL Server 2008在简单的SQL查询上崩溃
- 高版本sql数据库备份还原低版本怎样实现?
- sql-server-2008 – 在2008年的SQL Server 2012,脚本和使用
- sql-server – SQL Server差异(与交叉相反)
- 数据库设计 – 在具有缩写表名的表中为每个字段名添加前缀是
- 验证T-SQL存储过程的可靠方法
- sql-server-2000 – 如何从PHP 5.3及更高版本连接
- sql-server – 在HashBytes函数中选择正确的算法
- 小议sqlserver数据库主键选取策略
- sql-server – 何时使用TINYINT over INT?
- sql – 深度嵌套的子查询因子分解(CTE)的性能降低
- sql-server – T-SQL DROP TYPE IF EXISTS
- sql-server – SQL Server差异(与交叉相反)
- .net – 为什么这个DataAdapter不会将行插入数据
- iis – 如何隐藏DMZ中的连接字符串
- sql-server-2008 – 是否可以在SQL Server 2008中

