日期:2014-05-17  浏览次数:21116 次

当查询视图带 Where 条件 时,可会自动优化?
本帖最后由 kxjrzyk 于 2012-12-13 12:27:09 编辑
如题,假如用查询视图带 Where 条件时,Oracle 是否会自动优化?它的执行顺序是先查出全部数据,然后再用WHERE 条件过滤?还是直接把 Where条件 带进去,再查出相关数据,当视图连接多表时,会如何呢?SQL SERVER 是否也会自动优化
------解决方案--------------------
要看你的oracle版本了
视图并不存储数据(物理视图除外),他会和你的where条件一起进行被分析、执行
你可以做个试验的
------解决方案--------------------
不同的优化器可能行为不一样
一般是按从右到左解释.但不排除ORACLE重写查询的可能
------解决方案--------------------
在8i之前,Oracle 使用的是一种叫作RBO(Rule Based Optimizer)的优化器,它的执行机制非常简单,就是在优化器里面嵌入若干种规则,执行的SQL语句符合哪种规则(RANK),则按照规则(RANK)制定出相应的执行计划,比如说表上有个索引,如果谓词上有索引的列存在,则Oracle 会选择索引,否则选择全表扫描;又比如,两个表关联的时候,按照表在SQL中的位置来决定哪个是驱动表。
从8i开始,Oracle 引入了CBO(Cost Based Optimizer),它的思路是让Oracle 获取所有执行计划相关的信息,通过对这些信息做计算分析,最后得出一个代价最小的执行计划作为最终的执行计划。
CBO是一种比RBO 更理性化的优化器。从10g开始,Oracle 已经彻底丢弃了RBO。即使在表,索引没有被分析的时候,Oracle依然会使用CBO。此时,Oracle 会使用一种叫做动态采样的技术,在分析SQL的时候,动态的收集表,索引上的一些数据块,使用这些数据块的信息及字典表中关于这些对象的信息来计算出执行计划

------解决方案--------------------
应该会优化的,记得SQL SERVER好像是会。