#选择率与统计信息

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

# 选择率

选择率是基于filter的概念,它指的是filter的选择比例。filter主要给算子做过滤作用,最简单的例子就是在一个select * from t1 where col = 1的语句中,filter能够把scan算子扫出来的全部数据进行过滤,筛选出只满足col = 1的结果。

一般filter都是依附于算子上。基于是否是join的依据,filter可以分为连接条件和过滤条件(一些地方也叫join condition和filter来区分)。

连接条件指的是on上的条件或者隐式内连接时where上的条件,比如下述两条查询语句。

SELECT * FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1
SELECT * FROM t1, t2 WHERE t1.c1 = t2.c1

这两个filter则是连接条件,此外的可以认为是过滤条件。

而选择率就是filter在原来的数据基础上能够过滤出多少条数据的比率。假设t1一共有100条数据,而filter一共过滤出了10条。那么最终的选择率就是1/10。

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

# 统计信息

选择率计算的依据是收集上来的统计信息。因此统计信息的收集与否以及统计信息的准确与否很大程度上会影响选择率计算的准确性。 YashanDB的统计信息相关介绍见统计信息所述。

对于SQL调优来说,需要确保统计信息的实时性。通过查询视图和执行语句的方式,可以判断统计信息是否收集准确。 下面给出判断列最大值最小值的统计信息是否准确的例子, 其余的统计信息也可以通过类似的方式进行判断。

SELECT HIGH_VALUE FROM DBA_TAB_COL_STATISTICS WHERE table_name = 'T1' AND column_name = 'C1';

HIGH_VALUE
----------------------------------------------------------------
09000000


SELECT MAX(c1) FROM t1;

     MAX(C1)
------------
           9

         
SELECT LOW_VALUE FROM DBA_TAB_COL_STATISTICS WHERE table_name = 'T1' AND column_name = 'C1';

LOW_VALUE
----------------------------------------------------------------
01000000


SELECT MIN(c1) FROM t1;

MIN(C1)
------------
           1

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