逻辑优化和物理优化
数据库优化器基本上都支持逻辑优化和物理优化。逻辑优化的核心是代数的等价转换。物理优化的核心则是代价估算。合理的代数等价转换和代价估算是数据库优化器的一项重要功能。
当我们想查看一条语句的执行计划时,我们会执行EXPLAIN
相关语句,当执 行EXPLAIN ANALYZE
时,执行器会真正的执行这些语句,并打印出相应的计划。然而,当你单纯的执行EXPLAIN
时,也会出现相应的计划,然而执行器并没有真正执行语这些语句,那么这些信息是怎么来的呢?我们以Kingbase数据库来简要描述一下。
统计信息概述
Kingbase为了支持基于代价的优化(CBO)提供了统计信息功能,主要信息包含包括两个方面:
1. 表统计信息
优化器在计算表的扫描成本时,需要知道表的基本数据,例如元组的总数,占据磁盘块的页面数等信息。这些信息主要保存在sys_class系统表中,主要包含两个主要的字段:reltuples
和relpages
。
2. 列统计信息
列统计信息是指对表中的每一列的统计信息,主要存储在sys_statistic系统表中,它负责从多个角度描述该列的数据概况信息。
内容主要分2部分:
2.1 基本统计信息 – 主要是NULL值率、列的平均宽度、唯一值的个数或比例。见 sys_statistic 系统表中的stanullfrac、stawidth、stadistinct
等字段。
2.2 数据分布信息 – 直方图、最频值(mcv)和空值率等统计信息来进行选择率的估计。见most_common_vals、most_common_freqs、histogram_bounds
等字段。
其他字段及其含义可以参考Kingbase相关的文档
精确统计和采样
收集统计信息可以进行精确的统计,以可以采用采样的方法。KingbaseES中采用两种方式混合的策略收集统计信息。KingbaseES通过两种方式收集统计信息,一种是通过VACUUM、ANALYZE操作进行采样统计,另一种方式是通过利用一些DDL语句执行的副产品得到统计信息,例如在创(重)建索引的时候,利用建立索引需要对属性进行扫描和排序的特点,可以收集reltuples和stadistinct。
直方图简介
直方图是被广泛应用的一种统计图表,根据统计方法的不同,直方图可分为:
-
等宽直方图,等宽直方图的宽度是相同的,下面图的宽度为1。
-
等频直方图,又称为等高直方图,它的高度是相同的。下图为等频直方图,它的高度是相同的,宽度是不同的。
信息收集
1、主动收集
用户可以通过执行VACUUM ANALYZE或者ANALYZE语句让KingbaseES通过采样的方法收集统计信息。
2、自动收集
自动收集依赖于autovacuum进程,autovacuum launcher会定期或者根据触发条件进行触发,触发后将进行统计信息的统计。
代价模型常量
统计信息缺陷
1、统计信息本身具有偏差性,例如:基于表的统计信息是根据ANALYZE或者VACUUM等操作通过扫描部分信息进行估算的,具有一定的偏差性。
2、统计信息具有延后性,即使统计信息刚刚进行了更新操作,它的数据也是延后的,并不是实时的数据。所以与当前的实际数据具有一定的差异。
这会导致查询引擎在基于该统计信息计算最优查询访问路径时候的偏差,从而导致最后选择计划的偏差。
3、代价模型中不恰当的假设条件。不同的硬件系统对应的磁盘IO的读写性能是不相同的。例如:磁盘阵列(RAID)和固态硬盘(Solid State Disk)作为数据存储设备,写操作、顺序读取和随机读取的代价都有显著的不同。