性能优化之索引
建立索引简单规则
在一个OLTP 80%的问题SQL可以通过索引来进行优化,索引至关重要
通常建立索引遵循ESR (equal,sort,range)
1.Order columns with most selectivity first ;高选择率/区分度优先
2.Order columns to reduce I/O by clustering or sorting data;减少排序
Selectivity of index = cardinality/(numberof rows) * 100%
通过建立索引实现精准等值查询/范围查询,减少IO开销
通过索引有序性减少排序,降低CPU开销
通过索引规避回表(如db2 create index include),索引覆盖
索引常见误区
小表不需要索引
hash join不需要索引
高频访问小表无索引 CPU飙升
bufferpool 命中率高,高频访问小表未被LRU淘汰常驻内存,逻辑读高
无所有,内存table scan,row_evaluate_cost 开销大
高频查询(每秒超50次以上),CPU飙升,又无明显慢SQL,小表从1万行内;
OLAP连接优化之索引
先看一下ORACLE下常规的不同join优化方法
NL JOIN
驱动表的限制条件(where)要考虑建立索引
被驱动表连接条件(where)要考虑建立索引
确保小结果集先驱动,大的被驱动
HASH JOIN
两表限制条件有索引(where看返回量)
要小结果集先驱动,大的被驱动(set_table_stats构造)
尽量保证PGA能容纳Hash运算(memory_target 能加载小表)
Merge Sort JOIN
两表限制条件有索引(where看返回量)
连接条件索引消除排序(不完美,oracle只能避免一次排序)
避免取多余列致排序的尺寸太大
PGA能完成排序,避免磁盘排序
注:
1.NL join可以通过索引减少被驱动表IO, merge sort join(sort merge join)可以利用索引消除排序
2.通常没有索引的大表关联倾向使用hash join,这不等同于hash join不需要索引
3.索引/表都是数据,访问更小的数据意味着更少IO COST,在内存运算时更少的cpu cost;io/cpu负载双降