加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – Sql Server谓词懒惰?

发布时间:2020-12-31 21:23:38 所属栏目:MsSql教程 来源:网络整理
导读:我有一个问题: SELECT someFields FROM someTable WHERE cheapLookup=1 AND (CAST(someField as FLOAT)/otherField)0.9 那么,在cheapLookup为0的情况下,是否会执行CAST和除法?如果没有,在这种情况下如何避免计算? 解决方法 这取决于查询计划,查询计划由每

我有一个问题:

SELECT 
    someFields 
FROM 
    someTable 
WHERE 
    cheapLookup=1 
    AND (CAST(someField as FLOAT)/otherField)<0.9

那么,在cheapLookup为0的情况下,是否会执行CAST和除法?如果没有,在这种情况下如何避免计算?

解决方法

这取决于查询计划,查询计划由每个考虑的替代计划的估计成本确定,该计划将产生正确的结果.

如果谓词’cheapLookup = 1’可以使用索引,并且它具有足够的选择性,则SQL Server可能会选择在该索引上进行搜索并将第二个谓词应用为残差(即,仅在匹配的行上对其进行评估)寻求操作).

另一方面,如果cheapLookup不是索引中的主键,或者它不是非常有选择性,则SQL Server可能会选择扫描,将两个谓词应用于遇到的每一行.

第二个谓词不会被选择用于搜索操作,除非在整个表达式上碰巧存在索引计算列,并且使用该索引证明是执行整个查询的最便宜的方式.如果存在合适的索引,SQL Server将寻找’第二谓词结果< 0.9',并将'cheapLookup = 1'应用为残差.索引计算列也有可能将cheapLookup作为其第二个键,这将导致纯搜索,没有残差. 关于第二个谓词的另一个问题是,如果没有计算列(无论是否为索引),SQL Server将不得不猜测表达式的选择性.使用计算列,服务器可能能够在表达式结果列上创建统计信息,这将有助于优化程序.请注意,’CAST(someField as FLOAT)/ otherField’上的计算列必须在被索引或在其上创建统计信息之前保留,因为它包含不精确的数据类型. 总之,表达的复杂性并不像使用优化程序考虑的每种可用访问方法的整个计划的估计成本那么重要.

(编辑:辽源站长网)

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

    推荐文章
      热点阅读