background image

2优化子查询

    当使用自查询时,也许会碰到几个独特的问题。涉及子查询的查询潜在问题如下:
    ? 也许在执行完查询的剩余部分前执行子查询(与执行分组功能的视图相似)。
    ? 子查询也许要求特定的提示,但这些提示不直接与调用该子查询的查询有关。
    ? 可以作为单个查询执行的子查询也许被代替写成几个不同的子查询。
    ? 也许在使用 not in 子句或者 not exists 子句时,不能在最有效的方式下进行子查询的存在
查询。
    1)当执行子查询时
    如果一个查询包含子查询,那么优化器有两种完成查询的方法:首先完成子查询,然后完成

查询( 视图的方法 ),或者将子查询集成到查询里去( 联结 的方法)。如果首先解决子查询,
那么整个子查询的结果集将首先被计算,并且用查询条件的剩余部分做过滤器。如果没有使用子

查询去进行存在检查,那么 联结 方法将通常要比 视图 方法完成得好
    2)如何组合子查询
    一个查询可以包含多个子查询,使用的子查询越多,集成或者重写它们到大的联结里就越困
难。既然有多个子查询使集成困难,就应该尽可能地组合多个子查询。
    3)怎样进行存在检查
    有时子查询不返回行(记录),但可以进行数据正确性检查。在相关表里的记录或者存在或者
不存在的逻辑检查,称为存在检查。可以使用

exists 和 not exists 子句提高存在检查的性能。

2管理对非常巨大的表的访问

     随着表增长到比 SGA 的数据块高速缓冲区存储器的空间显著大时,需要从另一些角度优化
对这个表的查询。
     1  

) 当表和它的索引小的时候,在

SGA 里可以有高度的数据共享。多用户读表或索引范围扫

描可以反复使用同一个块。随着表的增长,表的索引也在增长。随着表和它的索引增长到比

SGA

里提供的空间大时,范围扫描需要的下一行将在

SGA 里找到的可能性变小,数据库的命中率将

减小。最后,每一个逻辑读将要求一个单独的物理读。对使用非常大的表的优化方法着眼于特别的
索引技术和有关索引的选择。
    2)管理数据接近,在访问非常大的表期间,如果倾向于继续使用索引,那么应该关注数据接
近,即逻辑相关记录的物理关系。为了使数据最大限度地接近,应该连续往表里插入记录。记录按
通常在表的范围扫描里使用的列排序。
    3)避免没有帮助的索引扫描,如果要对大表使用索引扫描,那么不能假定索引扫描将比全表
扫描执行得更好。不紧跟表访问的索引唯一扫描或范围扫描执行得比较好,但紧跟通过

RowID

的表访问的索引范围扫描也许执行得差。随着表增长到比数据块高速缓冲存储器大得多,最终,
索引扫描和全表扫描间的平衡点打破。
    4)创建充分索引的表,如果表中的数据相当稳定,充分索引一个表是很有用的。创建一个复
合索引,它包括所有在查询期间通常选择的列。在查询期间,查询要求的所有数据可以通过索引
访问提供,不需要任何表访问。
    5)并行选项,可以把一个数据库任务,比如 Select 语句,分为多个单元的工作,由多个
Oracle 进程同时执行。这种能够允许数据库的单个查询活动由多个协调的进程透明地进行处理的
能力,称为并行查询选项(

PQO)。并行选项调用多个进程来利用空闲的系统资源,以减少完成

任务所需要的时间。并行选项并不减少处理过程所要求的资源数量,而是把处理的任务分散给多

CPU。