调用视图的查询中的 where 子句是不是会影响视图本身的过滤器?
Posted
技术标签:
【中文标题】调用视图的查询中的 where 子句是不是会影响视图本身的过滤器?【英文标题】: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 秒。
感谢任何帮助。
【问题讨论】:
你可以尝试使用no_merge
提示
你制定了解释计划吗?您可以在此处列出解释计划并附在此处(请参阅allthingsoracle.com/execution-plans-part-1-finding-plans)。
【参考方案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)
我认为它可以满足您的需求。
【讨论】:
以上是关于调用视图的查询中的 where 子句是不是会影响视图本身的过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
Mysql InnoDB 视图变得缓慢并且不使用 Where 子句
where 子句中使用的 SQL Server 查询性能视图