我正在使用此查询来获取结果,其中Calander
(主键:DAY_DATE
)包含有关时间的所有连续信息(即日期,季度,年份等)和EXPENCE
INCOME
和TXN_DATE
都将列DAY_DATE
作为 SELECT
COALESCE(t1."FISCAL_YEAR",t2."FISCAL_YEAR") "FISCAL_YEAR" ,
"exp" "exp" ,
"rev" "rev"
FROM
(SELECT
Calander.FISCAL_YEAR "FISCAL_YEAR" ,
(SUM("EXPENCE"."TXN_AMT" )) "exp"
FROM
Calander ,
EXPENCE
WHERE
"EXPENCE"."TXN_DATE"="Calander"."DAY_DATE"
GROUP BY
FISCAL_YEAR ) t1 FULL OUTER JOIN (SELECT
Calander.FISCAL_YEAR "FISCAL_YEAR" ,
(SUM("INCOME"."TXN_AMT" )) "rev"
FROM
Calander ,
INCOME
WHERE
"INCOME"."TXN_DATE"="Calander"."DAY_DATE"
GROUP BY
FISCAL_YEAR ) t2 ON
t1."FISCAL_YEAR"=t2."FISCAL_YEAR"
ORDER BY
COALESCE(t1."FISCAL_YEAR",t2."FISCAL_YEAR")
的外键。
SELECT
FISCAL_YEAR "FISCAL_YEAR" ,
(sum("EXPENCE"."TXN_AMT" )) "exp",
(sum("INCOME"."TXN_AMT" )) "rev"
FROM
Calander ,
EXPENCE FULL OUTER JOIN INCOME ON
"EXPENCE"."TXN_DATE" = "INCOME"."TXN_DATE"
WHERE
"EXPENCE"."TXN_DATE"="Calander"."DAY_DATE" and
"INCOME"."TXN_DATE"="Calander"."DAY_DATE"
GROUP BY
FISCAL_YEAR
ORDER BY
FISCAL_YEAR
现在让查询更容易理解我做了这个
{{1}}
我在两个查询中得到相同的结果。在任何情况下结果都是不同的(Ist查询结果是正确的结果)? 什么会对绩效产生影响?
答案 0 :(得分:1)
第二个应该更有效,但要验证它,检查实际的执行计划。
也设置了SET STATISTICS IO ON
在会话上并检查对真实数据的两个查询的逻辑读取。
另一个习惯 - 停止在标识符周围使用双引号,或准备在某些时候使用QUOTED_IDENTIFIER设置命中:)
答案 1 :(得分:0)
第二个查询将在性能方面更好。 在第一个查询中,您在两个子查询中使用连接来过滤数据,然后再次加入它们,而第二个查询更加优化,因为您通过连接所有三个表来过滤数据。更多建议,避免使用旧式连接使您的查询可读且更好。