【发布时间】:2015-06-23 16:28:34
【问题描述】:
好的,所以我有一个大约需要 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 秒。
感谢任何帮助。
【问题讨论】:
-
你可以尝试使用
no_merge提示 -
你制定了解释计划吗?您可以在此处列出解释计划并附在此处(请参阅allthingsoracle.com/execution-plans-part-1-finding-plans)。
标签: sql oracle view where-clause sql-view