参考资料:
本系列博客主要参考资料有CUUG冉乃纲老师数据库教学笔记,《SQL优化核心思想》(罗炳森,黄超,钟侥著),《PostgreSQL技术内幕:查询优化深度探索》(张树杰著),排名不分先后。
1 统计信息说明
数据库的数据是一直变化的,那么执行计划有时候也是要动态变化的,举个简单的例子,今天某张表的商品ID是分布均匀的,那么某个促销活动,可能会让这个商品ID对应的数据暴增,原来走索引的查询,可能要走全表了。人为监控是表变化是不可能的,也是实现不了的。但是优化器已经在做这个工作了,优化器会自动调整执行计划。
那么问题来了,优化器是怎么做到的。
首先,关系数据库有完整的数学理论基础,关系代数,那么就可以根据等价变化,提供更好的执行计划。
但是,等价变换是优化的基础准则,但是这些等价变化,以及访问路径的变化(索引读还是全表扫),还要有一些参照数据才可以,这些参照数据就是统计信息。
2 统计信息收集脚本,
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SCOTT',
TABNAME=>'TEST1',
ESTIMATE_PERCENT=>100,
METHOD_OPT=>'FOR COLUMNS OWNER SIZE SKEWONLY',
NO_INVALIDATE=>FALSE,
DEGREE=>1,
CASCADE=>TRUE);
END;
/
这里面参数大家自己在网上查阅以下,我们这里只是重点说一下METHOD_OPT,这一列决定直方图生成。
那么什么是直方图呢,简单说,直方图描述了某列的数据分布均匀状况,这个是优化器选在访问路径以及表连接方式的重要参数。
3 扩展统计信息
有时候,只是收集某列的统计信息,并不会使优化器选出较好的执行计划,需要多列一起收集,这就是扩展统计信息收集,这个希望自己调查。