D2-00 11g 索引与性能-1(140 页).ppt
文本预览下载声明
赵元杰 zyj5681@ 2012年11月 OPTIMIZER_INDEX_CACHING参数: 告诉Oracle 索引在内存的数据缓冲区中的可能性有多大,即向优化器暗示位于Oracle 数据缓冲区的索引的数量 参数设置将会影响到“基于代价的优化” 做出的对一个表连接(嵌套循环)使用索引还是使用全表扫描选择 参数optimizer_index_caching是一个百分比参数,有效取值范围是0到100 3.OPTIMIZER_INDEX_CACHING OPTIMIZER_INDEX_CACHING调整: 影响基于CBO的SQL优化器的选择,优化器SQL查询结果可采用: 嵌套循环连接 哈希连接访问 全索引扫描 全表扫描访问 optimizer_index_caching 较大,优化器更趋向使嵌套循环连接(更便宜),优化器不是哈希连接或者归并排序连接 3.OPTIMIZER_INDEX_CACHING Oracle 9i /10g/11g的变化: 从Oracle 9i开始,运行配置多种块大小: 创建表空间的块大小为2K,4K,8K,16K和32K 并使用相似大小的表和索引来匹配表空间 多块变化: 大数据块的输入输出操作的边缘开销可忽略不计 取一个32K大小的数据块的开销仅比取一个2K大小的数据块的开销多1%,因为99%的磁盘输入输出操作都是用来把磁盘读写头的移动到相应的磁盘柱面和轨道 3.OPTIMIZER_INDEX_CACHING 索引与大块的表空间: 当索引被存储在大块表空间中时使用起来更有效。更深层的原因是: B-树可以更好地被平衡 并且对顺序索引节点访问而言有更小的磁盘开销 Robin Schumacher研究表明32K块大小的Oracle索引在执行索引范围扫描时需要更少的逻辑I/O,并且性能更高 3.OPTIMIZER_INDEX_CACHING 创建索引缓冲建议: 可在数据库处于活动状态创建索引缓冲 首先,把所有索引都移至某个单独的表空间,定义成一个单独的数据缓冲区 然后将参数optimizer_index_caching设置成正确的值 分配一个32K的缓冲区空间 alter system set db_32k_cache_size = 100m; 创建块大小32K的表空间 create tablespace index_ts_32k … blocksize 32k; 3.OPTIMIZER_INDEX_CACHING 创建索引缓冲建议(续): 把所有索引移至这个32K的表空间中 该命令把所有索引移至这个32K的表空间而无需中断当前存在的索引查询。它把索引重建成临时段,并确保新索引可用后在删除旧索引 alter index cust_idx rebuild online tablespace index_ts_32k; 3.OPTIMIZER_INDEX_CACHING 创建索引缓冲建议(续): 现在所有索引已经被隔离到一个单独的表空间和索引缓冲区中 查询数据字典,得到期望在内存索引缓冲区中看到的索引的数量: Select value - blocks optimizer_index_caching From v$parameter p, dba_segments s where name = db_32k_cache_size And tablespace_name = INDEX_TS_32K; 3.OPTIMIZER_INDEX_CACHING 3.OPTIMIZER_INDEX_CACHING 创建索引缓冲与嵌套连接: 只有采用( USE_NL )时才使用设置OPTIMIZER_INDEX_CACHING 参数,如: SQL alter session set optimizer_index_caching=90; Session altered. SQL show parameter optimizer_index_caching NAME TYPE VALUE ------------------- ----------- -------------------------- optimizer_index_caching integer 90 4.SKIP_UNUSABLE_INDEXES skip_unusable_indexes参数: 在会话中设置,表示要跳过无效的索引 在EXP中表示要跳过无效的索引 (不导出) 在IMP中表示要跳过无效的索引 (不维护) 索引为什么无效: 当将表从一个表空间迁移到另外新表空间后,原来的索引自动变为无效
显示全部