性能优化之索引

建立索引简单规则

在一个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负载双降