GBase 8c函数依赖统计

回到先前评估的问题,col2 的值仅仅是 col1/10 。在数据库的术语中,我们会说 col2 是函数依赖于 col1 ,也就是说,col1 的值足以决定 col2 的值,并且不存在有两行数据拥有相同的 col1 值的同时有不同的 col2 值。因此,在 col2 列上的第二个过滤筛选并没有移除任何行!但是,planner 捕捉到了足够的统计信息去知道这件事情。

让我们来创建一个统计对象去捕获这些列和运行分析(ANALYZE)所依赖的函数统计。

CREATE STATISTICS s1 (dependencies) on col1, col2 from tbl;

ANALYZE tbl;

让我们来看看现在的计划是怎么来的。

EXPLAIN ANALYZE SELECT * FROM tbl where col1 = 1 and col2 = 0;                            

                                                QUERY PLAN                                                 

-----------------------------------------------------------------------------------------------------------

 Seq Scan on tbl  (cost=0.00..194247.76 rows=9584 width=8) (actual time=0.638..629.741 rows=10000 loops=1)

   Filter: ((col1 = 1) AND (col2 = 0))

   Rows Removed by Filter: 9990000

 Planning time: 0.115 ms

 Execution time: 630.076 ms

(5 rows)

让我们看一下对计划的测量。

SELECT stxname, stxkeys, stxdependencies                                                  

  FROM pg_statistic_ext                                                                   

  WHERE stxname = 's1';   

stxname | stxkeys |   stxdependencies    

---------+---------+----------------------

 s1      | 1 2     | {"1 => 2": 1.000000}

(1 row)

看这里,我们可以看到, Postgres 意识到 col1 完全决定 col2 ,因此用系数1来捕获这些信息。现在,所有的查询都过滤这些列之后,计划将会得到更好的评估。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值