【问题标题】:Does the where clause in a query that calls a view, affect the filters in the view itself?调用视图的查询中的 where 子句是否会影响视图本身的过滤器?
【发布时间】: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 秒。

感谢任何帮助。

【问题讨论】:

标签: sql oracle view where-clause sql-view


【解决方案1】:

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)

我认为它可以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2014-07-17
    • 2018-07-15
    • 2010-12-18
    相关资源
    最近更新 更多