让我说我按如下方式查询数据库:
SELECT
T3.ID
T1.factor1 * T2.factor2 * T3.VAL,
T1.factor1 * T2.factor2 * T3.VAL,
T1.factor1 * T2.factor2 * T3.VAL,
T1.factor1 * T2.factor2 * T3.VAL,
(...)
T1.factor1 * T2.factor2 * T3.VAL
FROM
Table3 AS T3
LEFT JOIN Table2 AS T2 ON T3.ID = T2.Table3ID
LEFT JOIN Table1 AS T1 ON T3.ID = T1.Table3ID
我的问题是:
引擎会执行T1.factor1 * T2.factor2
,一次或 N次?
(请提供与您选择的数据库引擎相关的答案!)
你也可以给出一个更一般的答案(假设有 P 因子而不是2。
编辑:你可以用你选择的任何计算强化函数替换T1.factor1 * T2.factor2
,这对每个输出行都有一个不同的值。
答案 0 :(得分:2)
SELECT
T1.factor1 * T2.factor2 * T3.FIELD1,
T1.factor1 * T2.factor2 * T3.FIELD2,
T1.factor1 * T2.factor2 * T3.FIELD3,
T1.factor1 * T2.factor2 * T3.FIELD4,
(...)
T1.factor1 * T2.factor2 * T3.FIELDN
FROM
Table3 AS T3
LEFT JOIN Table2 AS T2
LEFT JOIN Table1 AS T1
不确定这里的问题是什么 - 你是否因为连接问这个问题?由于您的所有选择表达式都不同,我猜您的查询与联接
有关我的问题是 - 为什么数据库引擎会多次评估表达式?在什么情况下你期望这应该发生多次?
您要求每个表中的值...是什么让您相信SQL需要做的不仅仅是从这些表中的每一个获取值?
编辑:根据问题的调整 - 这是一个很好的。我不认为SQL会知道如何大量优化这一点,因为每次创建一个不同的标量操作时,你最初将每个字段乘以不同的字段。
我尝试做同样的计算300次,而另一次查询做了一次 - SQL没有报告查询成本的任何差异。当然还有很多值得关注的东西 - 但我认为差异太小,或者SQL正在优化这个
这是在MSSQL 2005上。
我会在你自己的数据库上尝试使用计算成本高昂的东西来比较查询计划。可能值得检查统计数据和其他绩效指标