1

假设我按如下方式查询数据库:

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您选择的任何计算密集型函数替换,该函数对于每个输出行都有不同的值。

4

1 回答 1

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 正在优化它

查询 * 300 与查询 * 1

这是在 MSSQL 2005 上。

我会在你自己的数据库上尝试这个计算昂贵的东西并比较查询计划。可能值得检查统计数据和其他性能指标

于 2012-08-02T09:35:12.053 回答