我使用的是mysql,我有一个复杂的视图,这导致了性能问题。
视图3的定义 select * from view_1 union select * from view_2
现在,当我运行一个查询来查看\u3时,如下所示 select * from view_3 where clolumn_a=value;
这是在处理一大组行时,可能正在执行全表扫描,然后返回结果。
那么,做下面这样的查询会更好吗 select * from view_1 where column_a=value union select * from view_2 where column_a=value;
这种视图处理行为在其他sql服务器(如oracle、mssql)中是否保持不变
predicate 会被推到视图的查询下面吗?
1条答案
按热度按时间fivyi3re1#
是的,视图就像其他语言的“宏”。视图的定义被“扩展”到使用它的查询中,然后整个查询(现在只是由对实际基表的访问组成,没有视图)作为一个整体进行优化。
假设优化器做得很好,它应该能够“向下”推任何 predicate ——如果有与 predicate 匹配的适当索引可用,可能选择使用索引查找而不是表扫描。
如果您想确切地看到优化器对您的查询做了什么,请学习如何获取和读取执行计划。在mysql中,这可以通过
EXPLAIN
.