我有一个问题:
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’上的计算列必须在被索引或在其上创建统计信息之前保留,因为它包含不精确的数据类型. 总之,表达的复杂性并不像使用优化程序考虑的每种可用访问方法的整个计划的估计成本那么重要.