PostgreSQL DBA(12) -统计信息在计算选择率上的应用# 2

  

本节以举例的形式简单介绍了PG数据库中统计信息(频值MCV和直方图直方图)在多条件查询计算选择率上的应用。

  

一、计算选择率

  

测试数据生成脚本详见上节,这里不再累述。

  

<强>多条件单列查询

  

SQL脚本和执行计划:

  
 <代码>=# testdb解释详细select * from t_int c1 & lt;2312年和c1祝辞500;
  查询计划
  -------------------------------------------------------------------
  Seq Scanc1 & lt;2312年和c1祝辞500”的选择率=" c1 & lt;2312年“选择率——“c1 & lt;=500”选择率:
  c1 & lt;2312年选择率=(1 - 0.0003)* (23 + (2312-2287-1)/(2388 - 2287)/100=.232306525
  c1 & lt;=500选择率=(1 - 0.0003)* (4 + (500 - 416)/(514 - 416)/100=.048556857
  c1 & lt;2312年和c1祝辞500年选择率=?32306525 - .048556857=.183749668,执行计划中的行=18375(取整)

  

<强>多条件多列查询

  

SQL脚本和执行计划:

  
 <代码>=# testdb解释详细select * from t_int c1 & lt;2312年和c2='测试';
  查询计划
  ---------------------------------------------------------------------
  Seq扫描在公共。t_int(成本=0.00,2040.00行=23宽度=9)
  输出:c1, c2
  过滤:((t_int。c1 & lt;2312)和((t_int.c2)::文本=安馐浴?:文本))
  (3行)
   
  

SQL语句有两个约束条件:c1 & lt;2312和c2=馐浴?br>   由于存在不同的两个列,运算符是,PG计算选择率的时候使用了概率论的方法,即:
  P (A和B)=x P P (A) (B)
  此例中,=c1 & lt;2312年,B=c='测试'
  从上节已知,P (A)=.232306525下面计算P (B)
  c2='测试',操作符是“=?使用高频值进行计算:

  
 <代码> testdb=# \ x
  扩展显示。=#选择staattnum testdb stakind1、staop1 stanumbers1, stavalues1,
  stakind2、staop2 stanumbers2 stavalues2,
  stakind3、staop3 stanumbers3 stavalues3
  从pg_statistic
  在starelid=16755
  和staattnum=2;
  - - - - - -[1]记录- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  staattnum | 2
  stakind1 | 1
  staop1 | 98
  stanumbers1 | {0.0015, 0.00146667, 0.00143333, 0.0014, 0.0014, 0.0014, 0.0014, 0.0014}
  stavalues1 | {C2685, C2999、C2279 C2399, C2556, C2723, C2777, C2833}
  stakind2 | 2
  staop2 | 664
  stanumbers2 |
  stavalues2 |{甜,C2106、C2116 C2125, C2134, C2142, C2151, C2160, C2169, C2178, C2187, C2196, C2203, C2212, C2220, C223, C2239, C2248, C2257, C2266, C2276, C2286, C2296, C2304, C2313, C2322, C2330, C2340, C235, C2358, C2367, C2376, C2385, C2394, C2403, C2411, C2421, C2430, C244, C2449, C2457, C2466, C2476, C2485, C2493, C2502, C2511, C252, C2529, C2538, C2547, C2555, C2565, C2574, C2583, C2592, C2600, C2610, C2620, C263, C264, C2649, C2658, C2666, C2674, C2683, C2693, C2701, C271, C2719, C2729, C2739, C2748, C2757, C2765, C2774, C2784, C2793, C2801, C2810, C2819, C2828, C2839, C2847, C2856, C2865, C2875, C2884, C2893, C2901, C2910, C2919, C2928, C2937, C2946, C2955, C2963, C2971, C2980, C299, C2998}
  stakind3 | 3
  staop3 | 664
  stanumbers3 | {0.829913}
  stavalues3 |=# testdb=#选择starelid testdb staattnum、stainherit stanullfrac, stawidth stadistinct
  从pg_statistic testdb - #
  - # testdb starelid=16755和staattnum=2;
  ——[1]记录- - - - - -
  starelid | 16755
  staattnum | 2
  stainherit | f
  stanullfrac | 0
  stawidth | 5
  stadistinct | 1000
   
  

从以上统计信息中可知,‘测试’不在高频值中,包括高频值共1000个有不同值,因此c2=安馐浴钡难≡衤?(1 -高频值比例)/(不同值个数——高频值个数),其中高频值比例=0.0015 + 0.00146667 + 0.00143333 + 0.0014 + 0.0014 + 0.0014 + 0.0014 + 0.0014=.0114不同值个数=1000,高频值个数=6,代入公式,计算得到选择率p (B)=.000994567

PostgreSQL DBA(12) -统计信息在计算选择率上的应用# 2