关于索引和sql语句的一些笔记

来源:互联网 发布:起点中文网网络异常 编辑:程序博客网 时间:2024/05/21 14:07

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


 
原创粉丝点击