至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在 Where 子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过 3 个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。总之,索引的建立必须慎重,对每个索引的必要性都应
该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上
建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多
的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性
能,特别是对频繁更新的表来说,负面影响更大。
3. 优化的方法
3.1. 列的操作的注意事项
任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时
要尽可能将操作移至等式的右边,甚至去掉函数。
例 1:
下列 SQL 条件语句中的列都建有恰当的索引,但 30 万行数据情况下执行速度却非常慢:
select * from record where substr(No,1,4)=’5378′(13 秒)
select * from record where Num/30< 1000(11 秒)
select * from record where to_char(C_date,’yyyymmdd’)=’20111201′(10 秒)
由于 where 子句中对列的任何操作结果都是在 SQL 运行时逐行计算得到的,因此它不得不进行表
扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被 SQL 优化器优
化,使用索引,避免表扫描,因此将 SQL 重写如下:
select * from record where No like ‘5378%’(< 1 秒)
select * from record where Num < 1000*30(< 1 秒)
select * from record where C_date= to_date (’20111201′ ,’yyyymmdd’)(< 1 秒)
差别是很明显的!
3.2. 避免不必要的类型转换
需要注意的是,尽量避免潜在的数据类型转换。如将字符型数据与数值型数据比较, ORACLE 会自
动将字符型用 to_number()函数进行转换,从而导致全表扫描。
例 2:表 tab1 中的列 col1 是字符型(char),则以下语句存在类型转换: