什么时候加索引, 如何加?
最经典的说法: 数据库慢了, 加索引. 加索引就快了吗?它可能使数据库更慢! 再复杂点,对同一字段, 加bitmap index可能快, 加成b-tree就可能更慢.
我觉得什么时候加和如何加应该一起考虑的, 以整体性能的变化为判断依据, 某种方式的索引, 加在某个字段上能够引起整体性能变好时加. 加索引没有绝对化的公式, 有的话数据库就自己替你加了. 加索引是一个尝试-->失败-->再尝试的过程, 直至达到预期的目标(优化前要先定下目标,不过这目标可能永远达不到).DBA完成这一过程所需的时间取决于经验.
加索引的步骤 :
1.提取一条SQL作为关键SQL, 尝试加索引(组)以提升性能
2.提取数条关键SQL作为关键SQL组 , 验证1得到的索引(组)对关键SQL组的性能影响(Plan 变化), 正面进行3, 负面返回1
3.扩展关键SQL到全体SQL, 验证1得到的索引(组)对全体SQL的性能影响(Plan 变化), 正面进行4, 负面返回1
4.纪录该索引(组)和它的性能, 不满意或资源足够返回1, 否则进行5
5.对得到的一批索引(组)进行比较, 选取性能最好的.
1可能永远到不了2或5,这时候要进行调整.
加索引要有索引组的概念, 几个索引之间会互相影响的.
简单开个头
建立索引(BTree)首要条件,表记录不能太小(尤其是没有join的表):
1:记录的选择性比较高(不同值不是太少)
2:做表连接的字段
3:经常位于where条件中的字段
……
关于索引可能带来不良影响:
在对大表进行较多记录的范围查询的时候
3个因素会影响数据缓冲区:
(关于2,我实在忘了出处了,sorry。大家可探讨。这关系到缓冲区数据块高低端和级别问题)
1:通过ROWID(索引)读出来的数据,将会挂在数据缓冲区高端,也就是将比较长的时间保持于数据缓冲区,如果重复利用机会小,则将可能造成性能问题
2:由于数据缓冲区的数据替换策略并不是严格的将整个对象替换出去
在压力比较大的情况下,它采取的是压缩各对象数据,换句话说,很可能存在这么一种情况,由于某个对象数据的进入,假设同时换出了5个对象的10%的数据,而以后正好又查询需要用这5个对象的被换出部分数据,则……
3: 索引本身也会占用sga,当索引大到一定程度的时候也需要考虑这个问题
当然,oracle采取这种策略也是有它的道理的
上面说的这些情况,毕竟不是常见的,只是一种可能