- 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替,在选择IN或EXIST操作时,要根据表容量大小来具体考虑
- 尽量使用NOT EXISTS或者外连接替代NOT IN操作符。因为NOT IN 不能应用表的索引。
- 尽量不用<>或者 !=操作符。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描
- 在设置表时,把索引列设置为 NOT NULL.判断字符是否为空一般是不会应用索引的,因为B树索引是不索引空值的。
- 尽量不用通配符%或者_作为查询字符串的第一个字符。因为这两个中的某一个作为查询字符串的第一个字符时,索引不会被使用
- where子句中避免在索引列上使用计算。如果索引不是基于函数,那么当在where子句中对索引列使用函数时,索引将不起作用,所以where子句中避免在索引列上使用计算。
- 用>=代替>。
- where后面的条件顺序要求。where后面的条件,表连接语句写在最前面,可以过滤掉最大数量记录的条件居后。
- 使用表的别名,并将之作为每列的前缀。当在SQL语句中连接多个表时,使用表的别名,并将之作为每列的前缀,这样可以减少解析时间。
- 进行了显式或者隐式的运算的字段不能进行索引。
- 用 UNION ALL代替 UNION. UNION是最常用的集操作,使多个记录级联成为单个集,对返回的数据行也有唯一性要求,所以Oracle就需要进行SORT UNIQUE操作,如果结果集又比较大,则操作会比较慢;UNION ALL操作不排除重复行,所以会快很多,如果数据本身重复行存在可能性较小时,用UNION ALL会比用UNION效率高很多
索引
select * from user_indexes 查询现有的索引
select * from user_ind_columns 查询索引建立在那些字段上。
索引是:一种用于提升查询效率的数据库对象,通过快速定位数据的方法,减少磁盘I/O操作,索引信息与表独立存放,Oracle数据库自动使用维护和维护索引。
索引分为 唯一性索引,非唯一性索引。
创建索引原则:
在select操作占大部分的表上创建索引。
在where子句中出现最频繁的列上创建索引。
在选择性高的列上创建索引,
创建索引 create index 索引名 on 表名(字段名)
删除索引drop index 索引名