避免索引:
.创建索引时使用NOSORT子句(在一个单CPU的机器中使用SQL*Loader时,可以在建索引时使用NOSORT子句,这样可以避免对数据进行预先排序。这个子句只对数据插入到表时有效):
SQL> create index EMPLOYEES_DEPARTMENT_ID_FK on employees(department_id) NOSORT;
ORA-01409: NOSORT option may not be used; rows are not in ascending order
在一个多CPU的机器中,并行加载数据可能更快,即使加载的数据不整齐。然后能够 使用并行索引创建来提高排序。
.使用UNION ALL代替UNION(使用UNION ALL代替UNION;这个子句不能消除重复,所以 不需要排序)
.Nested Loop Joins(嵌套的循环连接)
使用索引访问对于对等连接请求:
SQL> select department_name, Last_name
from employees e, departments d
where e.department_id = d.department_id;
最优化选择一个嵌套的循环连接代替一个合并排序连接。一个嵌套的循环连接不请求任何的排序。这步需要做下面的操作:
1、在employees表上执行一个全表扫描
2、对于返回的每一行使用DEPARTMENT_ID的值去执行一个唯一扫描在主键索引(departments表的主键)上
3、使用从索引扫描获得的ROWID去定位在departments表中匹配的行
4、把从employees表返回的行跟从departments表中返回的匹配的行合并
.在经常被ORDER BY子句引用的列上建索引(既然索引已经经过升序排序并且是双向链接,服务器使用索引好于一个排序操作。)
.对列进行分析(只对感兴趣的列收集统计;比如,那些相关的的连接条件,
ANALYZE... FOR COLUMNS 或者 ANALYZE...FOR ALL INDEXED COLUMNS.
注意:ANALYZE... SIZE n命令为相关的列建立柱状图。用FOR ALL INDEXED COLUMNS这个子句进行综合,对于主键和唯一键约束来说,可以避免产生不必 要的柱状图)
.ANALYZE ESTIMATE(COMPUTE子句对于最优化来说更精确。但是,它需要一个大的排 序空间。ESTIMATE子句对于大的表和簇表来说更好)