#选择率与统计信息

本小节将描述选择率原理、统计信息与选择率的关系以及相关调优判断。在复杂Join相应的优化中可以通过示例具体了解选择率对计划的影响。

# 选择率

通常,filter都依附于算子上。基于是否为join,filter可以分为连接条件和过滤条件(又称join condition和filter,用于区分)。

连接条件指的是on上的条件或隐式内连接时where上的条件(例如下述两条查询语句),其他均可以视作过滤条件。

SELECT * FROM area INNER JOIN branches ON area.area_no = branches.area_no;
SELECT * FROM area, branches WHERE area.area_no = branches.area_no;

选择率是filter过滤出的数据条数占原有数据的比率。假设表中一共有100条数据,filter过滤出了10条,选择率为1/10。

选择率会直接影响估计出来的行数。而在Cost Model里,行数是一个比较重要的评估要素。因此选择率会在很大程度上间接影响最终的cost评估。

# 统计信息

选择率计算的依据是收集到的统计信息,统计信息的收集与否以及统计信息的准确与否很大程度上会影响选择率计算的准确性。

YashanDB的统计信息相关介绍请查阅统计信息

对于SQL调优来说,需要确保统计信息的实时性。通过查询视图和执行语句的方式,可以判断统计信息是否收集准确。

以下示例将介绍如何判断列最大值/最小值的统计信息是否准确,其余的统计信息也可以通过类似的方式进行判断。

示例

SELECT HIGH_VALUE FROM DBA_TAB_COL_STATISTICS WHERE table_name = 'AREA' AND column_name = 'AREA_NO';
HIGH_VALUE
----------------------------
3035


SELECT MAX(area_no) FROM area;
MAX(AREA_NO)
------------
05

         
SELECT LOW_VALUE FROM DBA_TAB_COL_STATISTICS WHERE table_name = 'AREA' AND column_name = 'AREA_NO';

LOW_VALUE
--------------------------
3031


SELECT MIN(area_no) FROM area;
MIN(AREA_NO)
------------
01

pdf-btn 下载文档
copy-btn 复制链接