SQL查询
1. CBO倾向于使用where子句
2. 如果在where子句中使用函数,如substr,instr,to_date,to_number等,oracle优化器会忽略该列上的索引。如果必须使用函数,应确保使用的是基于函数的索引
3. 表链接
a) 尽量使用等值联结
b) 较早的使用过滤操作
c) 以产生最小行数的顺序进行联结,作为上一个步骤的输出结果
4. 使用case语句,适用于在同一个表内计算多个聚集
5. 使用where代替having
执行计划与HINT
1. All_Rows:只对吞吐量进行优化,但不优化语句的响应时间
2. All_Row(n):要求oracle快速返回前n行的数据
3. Full:强制oracle进行全表扫描
4. Ordered:强制在查询中表的连接次序
5. Index:强制使用一个索引扫描
6. Index_FFS:强制对索引进行一个快速全扫描,每次扫描的数据块多少由db_file_multiblock_read_count决定
联结方法
1. 避免笛卡尔乘积
2. 嵌套循环:对于小的数据子集进行联结,使用NL方法是最理想的,select /*+ use_NL (table_a, table_b)*/
3. 散列联结:对于会产生大的数据子集或表中很大一部分都要被联结的情况,可以强制使
用散列联结,select /*USE_hash*/
4. 合并联结:如果联结中的表是被一个不等式所联结,select /*+ USE_MERGE (TABLE_A, TABLE_B)*/
索引
1. 位图索引是特别为数据仓库设计的,但是只要2个表之间存在主外键关系,也可以是位图索引
2. 如果查询所检索的数据行数超过表中总行数的15%,就不需要索引
3. 对选择性高的列进行索引,高选择性意味着具有同样值的行很少
4. 对重要的外键进行索引
5. 对所有谓词进行索引
6. 对表联结中使用的列进行索引
7. 尽量避免对long进行索引
8. 尽量使用index-only计划
9. 对order by,group by,union,disctinct这样的分类操作中经常涉及的列使用索引
10. 索引类型:
a) B-tree:是默认的或标准的oracle索引,一般应用于oltp系统,
b) Bit-Map:被索引的列之用很少的不同值。该索引经过压缩,性能比B-Tree好。但如果被索引列有大量的DML操作,会导致问题
c) IOT:将所有的表数据放置在主键索引中,不需要独立索引,更像b-tree索引。
d) 拼接索引:包含一个以上列的索引,对于改进where的选择性很有帮助。但如果where子句没有制定拼接索引的引导列,oracle就不会使用索引。
e) 基于函数的索引:包含一个oracle函数或表达式进行转换后的列。非常适合经常使用的语句,且该语句包含与某个列有关的函数或复杂表达式
f) 反向键索引:适用于有大量插入操作的应用,但不能在索引范围扫描中使用。
分区索引的策略
1. 本地分区索引:与表的基本分区一致,如果表添加了一个分区,那么还要向本地分区索引添加一个分区
2. 全局分区索引:与表的分区不一致
3. 前缀索引:
4. 非前缀索引:
如果对表进行索引的重要原因是为了访问,则本地分区索引一个好的选择;
如果查询包含的列不是分区表的键的一部分,那么全局前缀索引是一个好的选择;
如果使用了并行查询操作,选择本地非前缀索引比较好。
删除不需要的索引
使用相似的sql语句
通过内嵌函数减少开销
使用变量绑定
避免不恰当的使用试图
避免不必要的全盘扫描
索引的监控:v$object_usage