数据驱动,成就未来 www.enmotech.com 合理利用索引解决性能问题
·216·
每一个跟数据库打交道的朋友,不管是开发人员
还是 DBA,都不可避免地要接触到索引,因为索引
如此地常见,对数据库的性能又具有如此巨大的影
响。每一种数据库,不管是 Oracle、MS SQL Server、
Sybase、DB2 等企业级数据库,还是如 MySQL 这样
的开源数据库,以及如 MS Access 这样的桌面型数据
库,都支持各种类型的索引。各个数据库的索引从原
理上都非常类似,但是实现细节可能存在比较大的差
异。本章只讨论 Oracle 数据库中索引的相关问题。
在 Oracle 数据库里,与索引相关的话题也是如此
之多。B-Tree 索引、位图索引、函数索引、反向键索
引、全局索引、本地索引、索引的聚集因子(Cluster
Factoring)、 单 列 索 引 、 复 合 ( 多 列 ) 索 引 、 索 引 是
否能一直保持平衡、是否应该以及什么时候重建索
引、索引是否应该与表分开放置在不同的表空间……
如果要完全展开这些话题进行讨论,恐怕得写成一本
厚厚的书。
本章将结合多个案例,重点描述 Oracle 数据库的
B Tree 索引的基本原理、特性,以及如何正确、合理
地使用 B Tree 索引来优化 SQL 性能,以解决性能问
题。对于索引的管理、维护,只是略有涉及,不做过
多阐述。
案例一:利用复合索引解决性能问题
这个案例发生在某天早上,运行在配置为 128GB 内存、64CPU 的 HP Superdome 上的 Oracle 9.2.0.8,出现
CPU 占用将近 100%,运行队列达到 60~80,应用反应速度很慢的异常情况。
在用户反映速度很慢后,检查 Oracle,发现很多的会话在等待 latch free,latch#为 98:
SQL> select * from v$latchname where latch#=98;
LATCH# NAME
---------- ----------------------------------------------------------------
98 cache buffers chains
由于本章重点描述的是索引,关于“cache buffers chains latch”的等待,此处不做过多说明,这个 latch 的等
待,通常情况下表明存在热点块,一般都是由于没有正确使用索引、SQL 所使用的索引选择率不高引起。检查
正在等待 latch free 的会话正在执行的 SQL,大部分都在执行类似于下面的 SQL:
SELECT SUM(cnt),
to_char(nvl(SUM(nvl(amount, 0)) / 100, 0), ’FM9999999999990.90′) amount
FROM (select count(payment_id) cnt, SUM(amount) amount
from TABLE_A
where staff_id = 12345
and CREATED_DATE >= trunc(sysdate)
and state = ’C0C’
and operation_type in (’5KA’, ’5KB’, ’5KC’, ’5KP’))
这里对 SQL 做了一些处理。
看起来这个 SQL 并不复杂,查看其执行计划:
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows |Bytes | Cost |Pstart |Pstop |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 125K | | |
评论