`
michael.softtech
  • 浏览: 206943 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

oracle一些小tip

阅读更多

近日在做报表的时候,有时候cpu利用率会很高,查看了一下发现主要是一些全表扫描(full scan) , 于是

了解了一下这个概念,顺带温习了一下oracle索引的相关知识,记录如下:

 

1. rowno与rowid

   前者是oracle对select出来的数据按照顺序分配的一个逻辑编号。

   后者是一个伪列,基本上每行记录生成之后就有一个rowid并且不再变化

2. B树索引与Bitmap索引

    B树索引实际就是一个平衡树索引,叶子节点上是key:rowid这种记录信息,每个索引条目指向一行。

    Bitmap索引是对基数比较小的key值,每个key值能索引一个或多个记录(一行记录根据值对每个key标记为0或者1).

    也正是如此,bitmap的索引列如果有更新时,需要锁定key值与待更新的key值相同的记录。因此容易引起死锁问题。

    所以位图所谓不适合与索引字段频繁更新的表。最好应用在数据仓库中。

3. 全表扫描

    首先需要明确的是oracle有大表和小表之分。

    大表如果有必要那么通过索引检索效率会高很多。小表的话直接全表扫描也是效率很高的。

    大表发生全表扫描的原因是没有索引或索引失去作用。

    B树索引如果遇到<>,is null ,is not null等条件时可能会失去作用。

4. oracle的一些基本概念

    block>extent>segment

    block通常为2k,4k,8k....

    extent 默认size为1M(uniform extent)

    oracle推荐的extent管理方式是LMT(locally managed tablespace).通过

    在tablespace的头里面维护extent的占用和空闲信息来提高效率。

    (相反的还有Dictionary managed tablespace,通过数据字典的方式维护相关信息)。

    可以通过表dba_tablespaces来了解tablespace的信息。

 

    每个extent下面的block必须是连续的地址空间。

    每个segment有多个extent组成,而且可以根据需要调整,所以segment下面的extent不一定是连续的。

    此外,每条记录可能会处于一个或多个block里面,而block也是oracle的基本操作unit,哪怕只查找一条记录,也会

    读取至少一个block的内容。

5. 可以通过 set autotrace traceonly explain 来查看sql的执行到底是全表扫描还是通过索引查找。

6. 可以通过,user_indexes,user_ind_columns了解系统(当前用户下)的具体索引情况。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics