它就是存储在数据字典中的一组数据,从多个角度描述了表的行数、页数、列数据分布情况、索引列数据分布和直方图信息。
作用:统计信息就像百度地图,比如你出门开车,打开百度地图你会一目了然的看到哪条路最适合你且时间成本最低,百度地图这个决定由什么来确定呢?是信息,如果百度地图采集信息没有做好,肯定会出现堵车。同样的道理,如果没有正确地收集表的统计信息,或者没有及时地更新表的统计信息,SQL的执行计划就会跑偏,SQL也就会出现性能问题。收集统计信息是为了让优化器选择最佳执行计划,以最少的代价(成本)查询出表中的数据。
达梦数据库的对象统计信息分三种类型:表统计信息、列统计信息、索引统计信息。
1)表:计算表的行数、所占的页数目、平均记录长度
2)列:统计列数据的分布情况
3)索引:统计索引列的数据分布情况
统计信息的收集和维护可以通过DBMS_STATS包,作为Oracle DBA对它也不陌生,可以通过desc dbms_stats来查看这个包体的内容,下图截取部分内容:
estimate_percent 表示采样率,范围是 0.000 001~100。
我们一般对小于 1GB 的表进行 100%采样,因为表很小,即使 100%采样速度也比较快。
有时候小表有可能数据分布不均衡,如果没有 100%采样,可能会导致统计信息不准。因此我们建议对小表 100%采样。
我们一般对表大小在 1GB~5GB 的表采样 50%,对大于 5GB 的表采样 30%。如果表特别大,有几十甚至上百 GB,我们建议应该先对表进行分区,然后分别对每个分区收集统计信息。
一般情况下,为了确保统计信息比较准确,我们建议采样率不要低于30%。
NSET2:结果集(result set)收集,一般是查询计划的顶层节点
PRJT2:关系的“投影”(project)运算,用于选择表达式项的计算;广泛用于查询,排序,函数索引创建等
AAGR2:简单聚集
说明:用于没有group by的count,sum,age,max,min等聚集函数的计算。
SLCT2:关系的“选择”(select)运算,用于查询条件的过滤。
CSCN2:CLUSTER INDEX SCAN的缩写即通过聚集索引扫描全表,全表扫描是最简单的查询,如果没有选择谓词,或者没有索引可以利用,则系统一般只能做全表扫描。在一个高并发的系统中应尽量避免全表扫描。
CSCN2 :基础全表扫描(a),从头到尾,全部扫描
SSCN2 :二级索引扫描(b), 从头到尾,全部扫描
SSEK2 :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
CSEK2 :聚簇索引范围扫描© ,通过键值精准定位到范围或者单值
BLKUP2 :根据二级索引的ROWID 回原表中取出全部数据(b + a)
结论:未收集统计信息之前,当name='杨凯',是走二级索引扫描的,说明执行计划是错误的。
因为当查询结果返回的是超过表中5%的数据时,应该走全表扫描。
结论:当收集表统计信息时,列和索引的统计信息也自动收集
结论:这次执行计划是完全正确的,符合CBO优化器的规则,
当name='杨凯',走全表扫描;
当name='张三',走二级索引扫描。
文章
阅读量
获赞