好的,我有一个大约需要3秒执行的视图,使用一些样本数据,它设法返回了总共11行。
然后,我执行一个调用视图的查询,如下所示:
SELECT SUM(COL1), SUM(COL2), SUM(COL3)
FROM
(SELECT CLIENT,
SUM(DECODE(COL1,'ABC',1,0)),
SUM(DECODE(COL2,'DEF',1,0)),
SUM(DECODE(COL3,'ABC',1,0)),
FROM MyView
WHERE INDICATOR IN ('GREEN','YELLOW')
GROUP BY CLIENT, TYPE
UNION ALL
SELECT 'TOTAL' TOTAL,
SUM(DECODE(COL1,'ABC',1,0)),
SUM(DECODE(COL2,'DEF',1,0)),
SUM(DECODE(COL3,'ABC',1,0)),
FROM MyView
WHERE INDICATOR IN ('GREEN','YELLOW')
GROUP BY TYPE
)
WHERE TYPE = 'TYPE A'
GROUP BY CLIENT以这种方式,它设法返回顶部按客户端分组的行,底部显示所有客户端的所有和的总和。
但是,当我运行整个查询时,执行时间超过1分钟,只有11行需要从视图中管理。
如果我独立地运行联合的每个部分,它们每个都需要大约11秒,如果我一起运行它们,它们大约需要23秒。
但是对于最外部的查询,它需要一分钟以上的时间?
我是不是遗漏了视图的工作原理?我注意到,如果从整个查询中去掉where子句,运行整个查询只需要12秒。
任何帮助都是非常感谢的。
发布于 2015-06-24 00:44:37
用group by rollup代替复杂的表达式怎么样?
SELECT CLIENT,
SUM(DECODE(COL1, 'ABC', 1, 0)),
SUM(DECODE(COL2, 'DEF', 1, 0)),
SUM(DECODE(COL3, 'ABC', 1, 0)),
FROM MyView
WHERE INDICATOR IN ('GREEN', 'YELLOW') AND
TYPE = 'A'
GROUP BY ROLLUP(CLIENT)我认为它做了你想要的。
https://stackoverflow.com/questions/31008382
复制相似问题