gpt4 book ai didi

sql-server - Sql Server 谓词惰性?

转载 作者:行者123 更新时间:2023-12-02 11:49:02 24 4
gpt4 key购买 nike

我有一个疑问:

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

那么,在cheapLookup0的情况下,是否会进行CAST和除法呢?如果不是,如何避免这种情况下的计算?

最佳答案

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

如果谓词“cheapLookup = 1”可以使用索引,并且它具有足够的选择性,SQL Server 可能会选择在该索引上查找并将第二个谓词作为残差应用(即,仅在满足以下条件的行上对其进行评估):与查找操作相匹配)。

另一方面,如果 CheapLookup 不是索引中的主键,或者选择性不强,SQL Server 可能会选择扫描,将两个谓词应用于遇到的每一行。

不会为查找操作选择第二个谓词,除非整个表达式上恰好有一个索引计算列,并且使用该索引是执行整个查询的最便宜的方法。如果存在合适的索引,SQL Server 将查找“第二个谓词结果 < 0.9”,并应用“cheapLookup=1”作为残差。索引计算列也有可能将 CheapLookup 作为其第二个键,这将导致纯粹的查找,没有残差。

关于第二个谓词的另一件事是,如果没有计算列(无论是否索引),SQL Server 将不得不猜测表达式的选择性。通过计算列,服务器可能能够在表达式结果列上创建统计信息,这将有助于优化器。请注意,“CAST(someField as FLOAT)/otherField”上的计算列必须先保留,然后才能对其进行索引或创建统计信息,因为它包含不精确的数据类型。

总之,重要的不是表达式的复杂性,而是使用优化器考虑的每种可用访问方法的整个计划的估计成本。

关于sql-server - Sql Server 谓词惰性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com