术语解释
行源 通过一个select语句从某个基对象(例如表或视图)或者组合的2个行源
断言 语句中where子句中的限定条件
驱动表 结果集首先产生的行源的表。如果从这个表返回的结果集太大,将会对之后的操作带来性能的巨大下降。
检查表 从驱动表返回数据以后,通过连接条件在这个表中继续查找满足的行。
Oracle如何访问数据?
物理级上,oracle通过block来读取数据。最少每次读取一个block,最多读取的block数量受到操作系统得限制。
逻辑级上,oracle通过下列方式读取数据:
·Full Table Scan (FTS) 即全表扫描
·Index Lookup(unique & non-unique)即索引扫描
·Rowid 即rowid扫描
执行计划的层级
简单的执行计划看起来像下面这个样子:
Query Plan
-----------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1234
TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED]
最右上边的操作是执行计划最先执行的操作。在这个例子中TABLE ACCESS FULL LARGE是第一个操作。这句话的意思是将对LARGE表进行全表扫描。这个操作完成以后的行源将传递给下一个级别的查询过程。在这个例子中 SELECT STATEMENT 是最上层的操作。
[CHOOSE] 是语句总体的优化提示。表示oracle自己选择了一种优化方式。确定执行优化到底是基于什么方式需要看cost= 部分。例如下面的的例子可以看出CBO(基于成本的方式)优化将被使用,因为cost有值。
SELECT STATEMENT [CHOOSE] Cost=1234
下面这个例子则使用了RBO(基于规则的方式)优化,因为cost部分是空的:
SELECT STATEMENT [CHOOSE] Cost=
Cost只是一个oracle内部的一个相对值用来决定单个计划的最小成本。不同语句的cost值不具有可比性。
[:Q65001]表示这个特殊的部分执行了并行操作。其中的数字表示操作会与串行相反的并行方式来进行。
[ANALYZED]表示目前语句中的对象的分析数据有效。不是表示在这个级别中进行了分析。