
美河学习在线 www.eimhe.com 收集分享
第 2 页 共 9 页
句,也有可能指 DML 语句中的查询部分。
我们知道,SQL 语句同其它语言(如 C 语言)的语句不一样,它是非过程化(non-procedural)
的语句,即当你要取数据时,不需要告诉数据库通 过何种途径去取数据,如到底是通过索引
取数据,还是应该将表中的每行数据都取出来,然后再通过一一比较的方式取数据(即全表扫
描)。
为了实现一个查询,内核必须为每个查询定制一个查询策略,或为取出符合条件的数据
生成一个执行计划(execution plan)。典型的,对于同一个查询,可能有几个执行计划都符
合要求,都能得到符合条件的数据。例如,参与连接的表可以有多种不同的连接方法,这取
决于连 接条件和优化器采用的连接方法。为了在多个执行计划中选择最优的执行计划,优化
器必须使用一些实际的指标来衡量每个执行计划使用的资源(I/0 次数、 CPU 等),这些资源
也就是我们所说的代价(cost)。如果一个执行计划使用的资源多,我们就说使用执行计划的
代价大。以执行计划的代价大小作为衡量标 准,优化器选择代价最小的执行计划作为真正执
行该查询的执行计划,并抛弃其它的执行计划。
3.1 选择最有效率的表名顺序
在 FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.首先,
扫描第一个表(FROM 子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM 子
句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行
合并.
基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问).
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录
选择 TAB2 作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间 0.96 秒 oracle 测试标准
选择 TAB2 作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间 26.09 秒
如果有 3 个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表,
交叉表是指那个被其他表所引用的表.
例如:
EMP 表描述了 LOCATION 表和 CATEGORY 表的交集.
相关文档
评论