1、一个索引到底有多大?table access by rowid的时候一般是一行记录就一个IO吧。索引的大小是否
就是rowid的大小加索引列的字节大小然后乘以总的行数。有多少行就是有多少个索引条目?索引的条目也是储存在索引的BLOCK中,这个BLOCK也和普通的BLOCK一样吧,比如8K就是8K吧,一个ROWID是8个字节吗?
索引的大小可以查dba_segments,oracle的块是访问的最小单元,table access by rowid,这时候访问一个块就是一个io
索引的大小应该是大于rowid的大小加索引列的字节大小然后乘以总的行数,因为还有一些其它的开销
索引的rowid,普通的索引是6bytes,分区表的全局分区索引是10bytes
2、访问索引也是访问索引块吧,也是块为单位吧?
是的,一般是先通过访问索引得到rowid,然后通过rowid得到行,有时候select的东西都在索引中,那么就不用在访问表了
3、怎么做一个实验,证明出物化视图在聚合查询上会更高效
这个很简单吧,人家保存的是计算后的结果,行的总数是远小于原来的表
4、索引全扫描一般是什么时候会使用
a.有一个非空的索引
b.查询的东西都在索引中
5、索引一般是高度平衡的,查询一个值,一般是1-3个IO,或者说高度是1-3
那这个IO是个什么概念?ORACLE读取一个块是一个IO吗?
索引一般是高度平衡主要指,访问索引的叶子的io一般是一样的
io就是访问硬盘(或者file buffer和存储buffer)的次数,访问索引或者通过索引得到的rowid访问表都是单块
读取一个块是否是一个io要情况的,这个不好说,要分情况讨论,比如全表扫描和快速全索引扫描,可以是多块读,一次io可以读取多个块
6、优化语句有一定的步骤吗
以我的经验,我是这样来处理的
6.1、看跑的语句表和索引是否有分析;
6.2、是看谓词是否有索引能提供ORACLE选择,分区表是否有利用到分区。
6.3、语句是否可以优化,比如把各个结果集经过过滤再合并而不是大合并再一起放后面过滤。
比如用分析函数来替代聚合脚本。
6.4、如果还慢是否考虑alter table move来减少高水平,重建索引来减少碎块,找到行清除和行连接的情况
并处理一下。
6.5、还慢就考虑修改应用,重写脚本,重新
这个步骤可以去看看performance tuning
[ 本帖最后由 棉花糖ONE 于 2008-1-25 09:05 编辑 ]
|