请问高手如何查询时,需要加载所有索引?索引过大,怕转硬盘。

shenlele088 2012-02-09 05:55:44
请问高手如何查询时,需要加载所有索引?索引过大,怕转硬盘。
或者怎样才能看到加载多少索引或者加载索引用了多少内存?
现在我这有个上亿的分区表,经常查询,并修改。想设全局索引,但是怕索引过大,内存不够,使用硬盘,就没有效率了。

局部索引又怕查询过慢。
...全文
84 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingchaoyan 2012-02-09
  • 打赏
  • 举报
回复
戴哥每次回帖都是长篇大论+诸多自我引用
Dave 2012-02-09
  • 打赏
  • 举报
回复

楼主对索引的理解可能有点模糊。

1. 索引的大小可以通过如下SQL 查看:
select bytes/1024/1024 from dba_segments where segment_name='xx';

2. 索引有自己的index segment,其也是存储在表空间里的。 索引里保存了表中记录的rowid和key value。 在使用时会先根据key value找到对应的rowid,然后直接去对应的block上读取需要的数据。
Oracle Rowid 介绍
http://blog.csdn.net/tianlesoftware/article/details/5020718

3. index segment 也会存放到buffer cache里。Buffer Cache是SGA的一部分,Oracle利用Buffer Cache来管理data block,Buffer Cache的最终目的就是尽可能的减少磁盘I/O。关于buffer cache 的管理这块内容有点深度,感兴趣可以参考:
Oracle Buffer Cache 原理
http://blog.csdn.net/tianlesoftware/article/details/6573438

4. 全局索引要比局部索引块,但是全局索引会增加维护的成本,比如我们truncate 一个分区,那么全局索引会失效,需要对索引进行重建,如果数据特别多,重建也是消耗很多时间,而本地索引会自动进行维护,相对维护成本会降低,所以在这2者之前的选择,要结合楼主实际情况。

5. 最后说说楼主疑惑的地方。index segment 也会存放在buffer cache里,这可能是全部的blocks,也可能是部分的blocks,因为buffer cache的大小是有限的,长期不用的blocks 会被清除出buffer cache。

Blocks within the buffer cache are ordered from MRU (most recently used) blocks to LRU (least recently used) blocks. Whenever a block is accessed, the block goes to the MRU end of the list, thereby shifting the other blocks down towards the LRU end. When a block is read from disk and when there is no buffer available in the db buffer cache, one block in the buffer cache has to "leave". It will be the block on the LRU end in the list.

假设我们要查询的index block 不在buffer cache时,也同样会从磁盘去读取,访问磁盘的速度肯定慢于从内存中直接读取,这点楼主理解的没有错。

但是另一个问题,索引是一种数据结构,对于B-Tree 索引,它的本质是二叉树。 那么从二叉树中找一个key value,肯定会快于全表扫描。 因为data block 存数是无序的,要扫描很多的block。 所以从这点上理解,即使我们从磁盘去读取index block的信息,其成本也大大小于全表扫描。 这个成本可以从执行计划中看出来。

以上是我个人的一些理解,写的也比较杂乱,仅供参考。

相关链接:
Oracle 执行计划(Explain Plan) 说明
http://blog.csdn.net/tianlesoftware/article/details/5827245

Oracle 分区表 总结
http://blog.csdn.net/tianlesoftware/article/details/4717318

Oracle 索引 详解
http://blog.csdn.net/tianlesoftware/article/details/5347098

Oracle 索引扫描的五种类型
http://blog.csdn.net/tianlesoftware/article/details/5852106

Oracle 索引的维护
http://blog.csdn.net/tianlesoftware/article/details/5680706


-----------------------
楼主的问题,我写了很多,因为楼主的这个问题有代表性,所以花了点时间,小整理了一下。 但是论坛里很多问题都是重复的问题,我一直都是强调提问之前先google,很多问题别人都提过N遍了,在提没有任何意义,所以对于这种重复的问题,一般我也只是看看。

作为一个技术人,首先要学会如何提问,这个我已经在论坛里置顶了,可以查看。


[Quote=引用楼主 shenlele088 的回复:]
请问高手如何查询时,需要加载所有索引?索引过大,怕转硬盘。
或者怎样才能看到加载多少索引或者加载索引用了多少内存?
现在我这有个上亿的分区表,经常查询,并修改。想设全局索引,但是怕索引过大,内存不够,使用硬盘,就没有效率了。

局部索引又怕查询过慢。
[/url][/Quote]

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧