加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

10 个你不知道的 PostgreSQL 成果

发布时间:2018-08-18 08:59:26 所属栏目:编程 来源:开源中国编译
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 英文原文:The Postgres 10 feature you didn't know about: CREATE STATISTICS 假如你曾行使 Postgres 做过一些机能优化,你或者已经行使过 EXPLAIN 。EXPLAIN 向你展示了 Postgre

planner 的预计镌汰了100倍! 让我们试着领略为什么产生这种环境。
第一个列的选择性约为 0.001(1/1000),第二个列的选择性为 0.01(1/100)。 要计较将由这两个“独立”前提过滤的行数,planner 会将它们的选择性相乘。 以是,我们获得:

选择性= 0.001 * 0.01 = 0.00001。

当它乘以我们在表中的行数即 10000000 时,我们获得 100。这就是 planner 对 100 的预计值的来历。 可是,这些列不是独立的,那么我们怎样奉告 planner ?

在 PostgreSQL 中建设统计信息

在 Postgres 10 之前,没有一种浅显的方法去汇报 planner 收罗捕获列之间相关的数据统计。可是, Postgres 10 有一个新特征正好办理了这个题目,可以行使 CREATE STATISTICS 来建设扩展统计的工具,汇报处事器去收罗这些故意思的相干列的特另外统计信息。

函数依靠统计

回到我们先前评估的题目,col2 的值仅仅是 col1/10 。在数据库的术语中,我们会说 col2 是函数依靠于 col1 ,也就是说,col1 的值足以抉择 col2 的值,而且不存在有两行数据拥有沟通的 col1 值的同时有差异的 col2 值。因此,在 col2 列上的第二个过滤筛选并没有移除任何行!可是,planner 捕获到了足够的统计信息去知道这件工作。

让我们来建设一个统计工具去捕捉这些列和运行说明(ANALYZE)所依靠的函数统计。

  1. CREATE STATISTICS s1 (dependencies) on col1, col2 from tbl;  
  2. ANALYZE tbl; 

让我们来看看此刻的打算是怎么来的。

  1. EXPLAIN ANALYZE SELECT * FROM tbl where col1 = 1 and col2 = 0;                             
  2.                                                 QUERY PLAN                                                  
  3. ----------------------------------------------------------------------------------------------------------- 
  4.  Seq Scan on tbl  (cost=0.00..194247.76 rows=9584 width=8) (actual time=0.638..629.741 rows=10000 loops=1) 
  5.    Filter: ((col1 = 1) AND (col2 = 0)) 
  6.    Rows Removed by Filter: 9990000 
  7.  Planning time: 0.115 ms 
  8.  Execution time: 630.076 ms 
  9. (5 rows) 

很好!让我们看一下对打算的丈量。

  1. SELECT stxname, stxkeys, stxdependencies                                                   
  2.   FROM pg_statistic_ext                                                                    
  3.   WHERE stxname = 's1';    
  4. stxname | stxkeys |   stxdependencies     
  5. ---------+---------+---------------------- 
  6.  s1      | 1 2     | {"1 => 2": 1.000000} 
  7. (1 row) 

看这里,我们可以看到, Postgres 意识到 col1 完全抉择 col2 ,因此用系数1来捕捉这些信息。此刻,全部的查询都过滤这些列之后,打算将会获得更好的评估。

ndistinct 统计

函数依靠是你可以在列之间捕捉的一种相关。 你可以捕捉的另一种统计信息是一组列的差异值。 我们之前指出,planner 可以获取每列差异值的统计数字,但再次归并多列时,这些统计数据每每是错误的。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读