sql-server – Sql Server谓词懒惰?
我有一个题目: 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’上的计较列必需在被索引或在其上建设统计信息之前保存,由于它包括不准确的数据范例. 总之,表达的伟大性并不像行使优化措施思量的每种可用会见要领的整个打算的预计本钱那么重要. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |