SQL引擎是否已经过优化? (见例)

时间:2012-08-02 09:27:56

标签: mysql sql sql-optimization

让我说我按如下方式查询数据库:

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,这对每个输出行都有一个不同的值。

1 个答案:

答案 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正在优化这个

Query * 300 vs Query * 1

这是在MSSQL 2005上。

我会在你自己的数据库上尝试使用计算成本高昂的东西来比较查询计划。可能值得检查统计数据和其他绩效指标