【重新发现PostgreSQL之美】- 15 沙盘推演, 权力的游戏

本文涉及的产品
性能测试 PTS,5000VUM额度
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 大家好,这里是重新发现PostgreSQL之美 - 15 沙盘推演, 权力的游戏

背景



有数据说数据, 没数据说案例, 没案例说逻辑, 没逻辑谈理想. 已经成为数字时代的职场生存法则.

•   要陈述一个观点或结论, 没有数据支撑说话没分量, 说明你没经过仔细分析, 没过脑子.

•   实在拿不到数据, 你总得拿点案例出来, 否则就是在空谈, 没有支点.

•   没案例, 总得有底层逻辑吧, 逻辑能自洽, 也是说得通的.

•   如果连逻辑都没有想过, 那你只能用故事、理想或者理念来感染人, 如果你能忽悠(感染)成功, 并且最后确实也成功了, 也许能表达为因为相信所以看见.

场景:

•   项目上线前, 申请资源, 如何评估需要多少资源?

•   做IT部门的全年预算?

•   如何做到精准, 有理有据有节?

挑战:

•   项目往往只有业务指标(应该叫目标, 和IT预算精算还差了十万八千里), 靠经验或拍脑袋来确定IT预算, 上线后发现资源不足或严重超过预期, 造成铺张浪费.

•   难以模拟和快速产生真实的业务数据.

•   难以模拟真实的业务交互行为.

•   难以捕捉和分析性能问题的原因.

PG解决方案:

•   pgbench,支持沙盘推演, 避免纸上谈兵、假大空.

◦                    一个可以近乎真实的模拟业务上线后的压力的内置benchmark program.

◦                    内置多种数据生成算法, 多种模拟业务和数据库交互的command,

◦                    同时支持根据业务定制化压测程序, 模拟真实的业务交互行为.

•   awr, pg_stat_statements, 捕获和分析业务瓶颈

◦                   
202104/20210415_01.md 《PostgreSQL pg_stat_statements AWR 插件pg_stat_monitor , 过去任何时间段性能分析[推荐、收藏]》

◦                   
202003/20200324_25.md 《PostgreSQL 活跃会话历史记录插件- pgsentinel 类似performance insight \ Oracle ASH Active Session History》

◦                   
201901/20190125_02.md 《PostgreSQL Oracle 兼容性之- performance insight - AWS performance insight 理念与实现解读- 珍藏级》

◦                   https://www.postgresql.org/docs/devel/pgstatstatements.html

•   快速构建海量测试数据

◦                   
202001/20200103_01.md 《PostgreSQL+MySQL 联合解决方案- 第3课视频- 如何压测PG数据库、如何瞬间构造海量测试数据》

◦                   
201711/20171121_01.md 《PostgreSQL 如何快速构建海量逼真测试数据》

 

例子

重点讲一下pgbench里面的一个小点:

•   产生各种分布形态的模拟数据(高斯分布、随机分布、指数分布、长尾分布)

为了让大家更容易理解概率分布情况, 建议先了解一下以下3种绘图方式.

1、柱状图

 

202104/20210429_01.md 《PostgreSQL - 时序、IoT类场景- 自定义histogram函数, 绘制数据分布柱状图- cte window range width_bucket format plpgsql》

CREATE OR REPLACE FUNCTION histogram(table_name_or_subquery text, column_name text, buckets int, leng int)    

RETURNS TABLE(bucket int, "range" numrange, freq bigint, ratio text, bar text)    

AS $func$    

DECLARE    

 sql text;    

BEGIN    

 sql := format('    

 WITH    

 source AS (    

   SELECT * FROM (%s) t    

 ),    

 min_max AS (    

   SELECT min(%s) AS min, max(%s) AS max FROM source    

 ),    

 histogram AS (    

   SELECT    

    width_bucket(%s, min_max.min, min_max.max+min_max.max*0.00000001, %s) AS bucket,    

    numrange(min(%s)::numeric, max(%s)::numeric, ''[]'') AS "range",    

     count(%s) AS freq    

   FROM source, min_max    

   WHERE %s IS NOT NULL    

   GROUP BY bucket    

   ORDER BY bucket    

 )    

 SELECT    

   bucket,    

  "range",    

  freq::bigint,    

   round(100 * freq::numeric/(sum(freq::numeric) over() + 1), 2)||'' %%'' as ratio,    

   repeat(''*'', (freq::float / (max(freq) over() + 1) * %s)::int) AS bar    

 FROM histogram group by bucket,"range",freq::bigint    

 order by bucket',    

table_name_or_subquery,    

 column_name,    

 column_name,    

 column_name,    

 buckets,    

 column_name,    

 column_name,    

 column_name,    

 column_name,    

 leng    

 );    

 RETURN QUERY EXECUTE sql;    

 raise notice '%', sql;    

END    

$func$ LANGUAGE plpgsql;  

select * from histogram(    

'select id as x from tbl',  -- 求这条SQL的结果集的柱状图    

'x',  -- 按这个字段的数值分布绘制柱状图, x是以上SQL的某个字段名    

25,   -- 均匀分布成25个bucket, 最好结果中的唯一值个数能刚好整除这个bucket    

20);  -- 展示进度条形式表示占比. 20是进度条的最长字符数  

2、高频词

pg_catalog.pg_stats.

这个是analyze之后产生的, 存储了字段的高频词, 也有bucket的概率分布等信息.

3、饼图

 

201808/20180804_01.md 《PostgreSQL psql 绘制饼图》

少量唯一值的group统计可以用来绘制饼图, 值很多的情况不适合

create or replace function gen_charts(    

 sql text,  -- SQL,返回两列,第一列为描述,第二列为这个描述的数值    

 width int default 80,    

 height int default 25,    

 radius numeric default 1.0,   -- 换成float8类型,打印实心饼图  

 colours text default '#;o:X"@+-=123456789abcdef'      

) returns setof text as $$    

declare    

begin    

return query execute format(    

$_$    

WITH slices AS (  

SELECT  CAST(ROW_NUMBER() OVER () AS INTEGER) AS slice,    

        name,    

     VALUE,  

     100.0 * VALUE / SUM(VALUE) OVER () AS percentage,    

     2*PI() * SUM(VALUE) OVER (ROWS unbounded preceding)    

               / SUM(VALUE) OVER () AS radians    

  FROM (%s    

       ) AS DATA(name,VALUE))    

(    

 SELECT array_to_string(array_agg(c),'') AS pie_chart  

   FROM (    

   SELECT x, y,    

          CASE WHEN NOT (SQRT(pow(x, 2) + pow(y, 2))    

                           BETWEEN %s*1/10 AND %s)    

              THEN ' '    

              ELSE SUBSTRING(%L,    

                              (SELECT MIN(slice)    

                                 FROM slices    

                                WHERE radians >= PI() + atan2(y,-x)),    

                              1)    

               END AS c    

     FROM (SELECT 2.0*generate_series(0,%s)/%s-1.0) AS x(x),  

          (SELECT 2.0*generate_series(0,%s)/%s-1.0) AS y(y)  

    ORDER BY y,x    

 ) AS xy    

GROUP BY y    

ORDER BY y    

)    

UNION ALL    

SELECT repeat(SUBSTRING(%L,slice,1), 2) || '  ' ||    

      name || ': ' ||    

      VALUE || '  (' || round(percentage,0) || '%%)'    

 FROM slices;    

$_$, sql, radius, radius, colours, width, width, height, height, colours);    

   

return;    

end;    

$$ language plpgsql strict;    

postgres=# select * from gen_charts('select mod(id,5),count(*) from tbl group by 1 order by 2 desc');  

                                  gen_charts                                      

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

                                        ;                                          

                        ;;;;;;;;;;;;;;;;;;;;;;;;;;;####                          

                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;###########                    

              ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;################                

          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#####################            

       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#########################          

     oooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;############################        

    ooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;##############################      

   oooooooooooooooooo;;;;;;;;;;;;;;;;;;;;;;;;#################################    

 ooooooooooooooooooooooo;;;;;;;;;;;;;;;;;;;###################################    

oooooooooooooooooooooooooooo;;;;;;;;;;;;;;#####################################  

 ooooooooooooooooooooooooooooooooo;;;;;;;;######################################  

oooooooooooooooooooooooooooooooooooo      ####################################  

oooooooooooooooooooooooooooooooooooo      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  

 ooooooooooooooooooooooooooooooooo::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  

ooooooooooooooooooooooooooooo:::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  

 ooooooooooooooooooooooo:::::::::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    

   oooooooooooooooooo::::::::::::::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX    

    ooooooooooo::::::::::::::::::::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX      

     oooooo:::::::::::::::::::::::::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXXXXX        

        ::::::::::::::::::::::::::::::::::::::::XXXXXXXXXXXXXXXXXXXXXXXXX          

          ::::::::::::::::::::::::::::::::::::::XXXXXXXXXXXXXXXXXXXXX            

              :::::::::::::::::::::::::::::::::::XXXXXXXXXXXXXXXX                

                   ::::::::::::::::::::::::::::::::XXXXXXXXXXX                    

                        ::::::::::::::::::::::::::::XXX                          

                                        :                                          

##  2: 563867 (20%)  

;;  3: 563581 (20%)  

oo  4: 563241 (20%)  

::  1: 562509 (20%)  

XX  0: 562363 (20%)  

(31 rows)  

4、R绘图

 

201506/20150618_01.md 《生成泊松、高斯、指数、随机分布数据- PostgreSQL 9.5 new feature - pgbench improve, gaussian (standard normal) & exponential distribution》

纵轴: 概率

横轴: value

 

 

 

 

 

 

 

 

 

1 随机分布

create unlogged table tbl (id int, info text);  

为了便于观察概率分布情况, 取100个值.

vi test.sql  

 

\set id random(1,100)

insert into tbl values (:id, 'test');  

 

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 12 -j 12 -T 20  

概率分布情况:

bucket |  range  |  freq  | ratio |         bar            

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

     1 | [1,4]    | 112623 | 4.00 % | ********************  

     2 | [5,8]    | 113083 | 4.02 % | ********************  

     3 | [9,12]   | 112719 | 4.00 % | ********************  

     4 | [13,16]  | 112613 | 4.00 % | ********************  

     5 | [17,20]  | 112798 | 4.01 % | ********************  

     6 | [21,24]  | 113045 | 4.02 % | ********************  

     7 | [25,28]  | 112343 | 3.99 % | ********************  

     8 | [29,32]  | 113011 | 4.01 % | ********************  

     9 | [33,36]  | 112894 | 4.01 % | ********************  

    10 | [37,40]  | 112040 | 3.98 % | ********************  

    11 | [41,44]  | 112700 | 4.00 % | ********************  

    12 | [45,48]  | 112247 | 3.99 % | ********************  

    13 | [49,52]  | 112771 | 4.01 % | ********************  

    14 | [53,56]  | 112284 | 3.99 % | ********************  

    15 | [57,60]  | 112399 | 3.99 % | ********************  

    16 | [61,64]  | 112181 | 3.98 % | ********************  

    17 | [65,68]  | 112560 | 4.00 % | ********************  

    18 | [69,72]  | 112514 | 4.00 % | ********************  

    19 | [73,76]  | 112681 | 4.00 % | ********************  

    20 | [77,80]  | 112666 | 4.00 % | ********************  

    21 | [81,84]  | 112508 | 4.00 % | ********************  

    22 | [85,88]  | 112864 | 4.01 % | ********************  

    23 | [89,92]  | 113081 | 4.02 % | ********************  

    24 | [93,96]  | 112283 | 3.99 % | ********************  

    25 | [97,100] | 112653 | 4.00 % | ********************

(25 rows)  

 

2 高斯分布

truncate tbl;  

 

\set id random_gaussian(1,100,2.5)  

insert into tbl values (:id, 'test');  

 

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 12 -j 12 -T 20  

概率分布情况:

bucket |  range  |  freq  | ratio |         bar            

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

     1 | [1,4]    |  13432 | 0.46 % | *  

     2 | [5,8]    | 21253 | 0.72 % | **  

     3 | [9,12]   |  32501 | 1.10 % | ***  

     4 | [13,16]  |  47288 | 1.60 % | ****  

     5 | [17,20]  |  66095 | 2.24 % | ******  

     6 | [21,24]  |  89577 | 3.04 % | ********  

     7 | [25,28]  | 115935 | 3.93 % | **********  

     8 | [29,32]  | 144387 | 4.89 % | ************  

     9 | [33,36]  | 173053 | 5.87 % | ***************  

    10 | [37,40]  | 198419 | 6.73 % | *****************  

    11 | [41,44]  | 219778 | 7.45 % | ******************  

    12 | [45,48]  | 233489 | 7.91 % | ********************  

    13 | [49,52]  | 238105 | 8.07 % | ********************  

    14 | [53,56]  | 234864 | 7.96 % | ********************  

    15 | [57,60]  | 219427 | 7.44 % | ******************  

    16 | [61,64]  | 198440 | 6.73 % | *****************  

    17 | [65,68]  | 172913 | 5.86 % | ***************  

    18 | [69,72]  | 144989 | 4.91 % | ************  

    19 | [73,76]  | 116383 | 3.95 % | **********  

    20 | [77,80]  |  89234 | 3.02 % | *******  

    21 | [81,84]  |  66099 | 2.24 % | ******  

    22 | [85,88]  |  47493 | 1.61 % | ****  

    23 | [89,92]  |  32253 | 1.09 % | ***  

    24 | [93,96]  |  21227 | 0.72 % | **  

    25 | [97,100] |  13485 | 0.46 % | *  

(25 rows)  

bucket |   range   | freq | ratio  |         bar            

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

     1 | [1,1]     |  2772 | 0.10 % | *  

     2 | [2,2]     |  3115 | 0.11 % | *  

     3 | [3,3]     |  3509 | 0.12 % | *  

     4 | [4,4]     |  3943 | 0.14 % | *  

     5 | [5,5]     |  4453 | 0.15 % | **  

     6 | [6,6]     |  4918 | 0.17 % | **  

     7 | [7,7]     |  5281 | 0.18 % | **  

     8 | [8,8]     |  6079 | 0.21 % | **  

     9 | [9,9]     |  6729 | 0.23 % | **  

    10 | [10,10]   | 7571 | 0.26 % | ***  

    11 | [11,11]   |  8314 | 0.29 % | ***  

    12 | [12,12]   |  9317 | 0.32 % | ***  

    13 | [13,13]   | 10043 | 0.35 % | ***  

    14 | [14,14]   | 11067 | 0.38 % | ****  

    15 | [15,15]   | 12295 | 0.42 % | ****  

    16 | [16,16]   | 13300 | 0.46 % | *****  

    17 | [17,17]   | 14253 | 0.49 % | *****  

    18 | [18,18]   | 15499 | 0.54 % | *****  

    19 | [19,19]   | 16740 | 0.58 % | ******  

    20 | [20,20]   | 18166 | 0.63 % | ******  

    21 | [21,21]   | 19789 | 0.68 % | *******  

    22 | [22,22]   | 20970 | 0.72 % | *******  

    23 | [23,23]   | 22950 | 0.79 % | ********  

    24 | [24,24]   | 24604 | 0.85 % | ********  

    25 | [25,25]   | 25854 | 0.89 % | *********  

    26 | [26,26]   | 27707 | 0.96 % | *********  

    27 | [27,27]   | 29553 | 1.02 % | **********  

    28 | [28,28]   | 31101 | 1.07 % | ***********  

    29 | [29,29]   | 32583 | 1.13 % | ***********  

    30 | [30,30]   | 34714 | 1.20 % | ************  

    31 | [31,31]   | 36389 | 1.26 % | ************  

    32 | [32,32]   | 37939 | 1.31 % | *************  

    33 | [33,33]   | 39881 | 1.38 % | **************  

    34 | [34,34]   | 41757 | 1.44 % | **************  

    35 | [35,35]   | 43436 | 1.50 % | ***************  

    36 | [36,36]   | 45062 | 1.56 % | ***************  

    37 | [37,37]   | 46501 | 1.61 % | ****************  

    38 | [38,38]   | 47971 | 1.66 % | ****************  

    39 | [39,39]   | 49850 | 1.72 % | *****************  

    40 | [40,40]   | 51173 | 1.77 % | *****************  

    41 | [41,41]   | 52545 | 1.81 % | ******************  

    42 | [42,42]   | 53146 | 1.84 % | ******************  

    43 | [43,43]   | 54303 | 1.88 % | *******************  

    44 | [44,44]   | 54906 | 1.90 % | *******************  

    45 | [45,45]   | 56245 | 1.94 % | *******************  

    46 | [46,46]   | 57177 | 1.97 % | ********************  

    47 | [47,47]   | 57219 | 1.98 % | ********************  

    48 | [48,48]   | 58151 | 2.01 % | ********************  

    49 | [49,49]   | 58306 | 2.01 % | ********************  

    50 | [50,50]   | 57975 | 2.00 % | ********************  

    51 | [51,51]   | 58419 | 2.02 % | ********************  

    52 | [52,52]   | 58561 | 2.02 % | ********************  

    53 | [53,53]   | 58121 | 2.01 % | ********************  

    54 | [54,54]   | 57767 | 1.99 % | ********************  

    55 | [55,55]   | 56827 | 1.96 % | *******************  

    56 | [56,56]   | 56762 | 1.96 % | *******************  

    57 | [57,57]   | 55026 | 1.90 % | *******************  

    58 | [58,58]   | 54578 | 1.88 % | *******************  

    59 | [59,59]   | 52974 | 1.83 % | ******************  

    60 | [60,60]   | 52356 | 1.81 % | ******************  

    61 | [61,61]   | 51089 | 1.76 % | *****************  

    62 | [62,62]   | 49518 | 1.71 % | *****************  

    63 | [63,63]   | 48436 | 1.67 % | *****************  

    64 | [64,64]   | 46651 | 1.61 % | ****************  

    65 | [65,65]   | 44896 | 1.55 % | ***************  

    66 | [66,66]   | 43576 | 1.50 % | ***************  

    67 | [67,67]   | 41402 | 1.43 % | **************  

    68 | [68,68]   | 39948 | 1.38 % | **************  

    69 | [69,69]   | 38070 | 1.31 % | *************  

    70 | [70,70]   | 36540 | 1.26 % | ************  

    71 | [71,71]   | 34686 | 1.20 % | ************  

    72 | [72,72]   | 32937 | 1.14 % | ***********  

    73 | [73,73]   | 31284 | 1.08 % | ***********  

    74 | [74,74]   | 29431 | 1.02 % | **********  

    75 | [75,75]   | 27559 | 0.95 % | *********  

    76 | [76,76]   | 25754 | 0.89 % | *********  

    77 | [77,77]   | 24428 | 0.84 % | ********  

    78 | [78,78]   | 22623 | 0.78 % | ********  

    79 | [79,79]   | 20849 | 0.72 % | *******  

    80 | [80,80]   | 19831 | 0.68 % | *******  

    81 | [81,81]   | 18070 | 0.62 % | ******  

    82 | [82,82]   | 16890 | 0.58 % | ******  

    83 | [83,83]   | 15677 | 0.54 % | *****  

    84 | [84,84]   | 14462 | 0.50 % | *****  

    85 | [85,85]   | 13420 | 0.46 % | *****  

    86 | [86,86]   | 12338 | 0.43 % | ****  

    87 | [87,87]   | 10995 | 0.38 % | ****  

    88 | [88,88]   | 10231 | 0.35 % | ***  

    89 | [89,89]   |  9213 | 0.32 % | ***  

    90 | [90,90]   |  8337 | 0.29 % | ***  

    91 | [91,91]   |  7535 | 0.26 % | ***  

    92 | [92,92]   |  6751 | 0.23 % | **  

    93 | [93,93]   |  6222 | 0.21 % | **  

    94 | [94,94]   |  5479 | 0.19 % | **  

    95 | [95,95]   |  4958 | 0.17 % | **  

    96 | [96,96]   |  4339 | 0.15 % | *  

    97 | [97,97]   |  3870 | 0.13 % | *  

    98 | [98,98]   |  3453 | 0.12 % | *  

    99 | [99,99]   |  3063 | 0.11 % | *  

   100 | [100,100] |  2777 | 0.10 % | *  

(100 rows)  

参数说明:

threshold >= 2.0

高斯分布(正态分布)的概率峰值出现在min,max的数学期望值即(max + min) / 2.0。

约67%的值分布在以min,max数学期望为中心的1.0 / threshold 这个区间。

约95%的值分布在以min,max数学期望为中心的2.0 / threshold 这个区间。

所以threshold越大,数据数据越集中在min,max的数学期望附近。

 

3 指数分布

truncate tbl;  

 

\set id random_exponential(1,100,3.0)  

insert into tbl values (:id, 'test');  

概率分布情况:

bucket |  range  |  freq  | ratio  |       bar        

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

     1 | [1,4]    | 353424 | 11.91 % | ***************  

     2 | [5,8]    | 312966 | 10.55 % | *************  

     3 | [9,12]   | 277325 | 9.34 %  | ************  

     4 | [13,16]  | 246483 | 8.31 %  | **********

     5 | [17,20]  | 218639 | 7.37 %  | *********

     6 | [21,24]  | 193728 | 6.53 %  | ********

     7 | [25,28]  | 172174 | 5.80 %  | *******

     8 | [29,32]  | 152792 | 5.15 %  | ******

     9 | [33,36]  | 135425 | 4.56 %  | ******

    10 | [37,40]  | 119895 | 4.04 %  | *****

    11 | [41,44]  | 106444 | 3.59 %  | *****

    12 | [45,48]  |  94220 | 3.17 %  | ****

    13 | [49,52]  |  83763 | 2.82 %  | ****

    14 | [53,56]  |  74046 | 2.50 %  | ***  

    15 | [57,60]  |  66040 | 2.23 %  | ***  

    16 | [61,64]  |  58151 | 1.96 %  | **  

    17 | [65,68]  |  51363 | 1.73 %  | **  

    18 | [69,72]  |  45887 | 1.55 %  | **  

    19 | [73,76]  |  40873 | 1.38 %  | **  

    20 | [77,80]  |  35882 | 1.21 %  | **  

    21 | [81,84]  |  32248 | 1.09 %  | *  

    22 | [85,88]  |  28587 | 0.96 %  | *  

    23 | [89,92]  |  25010 | 0.84 %  | *  

    24 | [93,96]  |  22546 | 0.76 %  | *  

    25 | [97,100] |  19815 | 0.67 %  | *  

(25 rows)  

参数说明:

threshold > 0

(threshold越大,随机值接近min的概率越大,反之,threshold越小,随机值接近max的概率越大)

threshold 越接近0,则越趋于随机分布,而不是指数分布。

 

长尾分布

truncate tbl;  

 

\set id random_zipfian(1, 100, 1.001)  

insert into tbl values (:id, 'test');  

概率分布情况:

bucket |  range  |  freq  | ratio  |         bar            

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

     1 | [1,4]    | 911700 | 40.21 % | ********************  

     2 | [5,8]    | 276736 | 12.21 % | ******  

     3 | [9,12]   | 168646 | 7.44 %  | ****

     4 | [13,16]  | 121354 | 5.35 %  | ***  

     5 | [17,20]  |  94427 | 4.16 %  | **  

     6 | [21,24]  |  78154 | 3.45 %  | **  

     7 | [25,28]  |  66173 | 2.92 %  | *  

     8 | [29,32]  |  57071 | 2.52 %  | *  

     9 | [33,36]  |  50582 | 2.23 %  | *  

    10 | [37,40]  |  45865 | 2.02 %  | *  

    11 | [41,44]  |  40835 | 1.80 %  | *  

    12 | [45,48]  |  37525 | 1.66 %  | *  

    13 | [49,52]  |  34916 | 1.54 %  | *  

    14 | [53,56]  |  32284 | 1.42 %  | *  

    15 | [57,60]  |  29811 | 1.31 %  | *  

    16 | [61,64]  |  28028 | 1.24 %  | *  

    17 | [65,68]  |  26214 | 1.16 %  | *  

    18 | [69,72]  |  24556 | 1.08 %  | *  

    19 | [73,76]  |  23285 | 1.03 %  | *  

    20 | [77,80]  |  22211 | 0.98 %  |  

    21 | [81,84]  |  21089 | 0.93 %  |  

    22 | [85,88]  |  20134 | 0.89 %  |  

    23 | [89,92]  |  19093 | 0.84 %  |  

    24 | [93,96]  |  18686 | 0.82 %  |  

    25 | [97,100] |  17964 | 0.79 %  |  

(25 rows)  

参数说明:

threshold 取值范围: [1.001, 1000]

k 的概率为k+1 的((k+1)/k)^threshold 次方

threshold越大, 概率曲线越陡峭, 头部值(begin值)出现概率越高. 递弱代偿线越陡峭.

For example, random_zipfian(1, ..., 2.5) produces the value

1 about (2/1)^2.5 = 5.66 times more frequently than 2,

2 about (3/2)^2.5 = 2.76 times more frequently than 3,

and so on.

今天只讲了关于随机数据生成的其中一种方法, PG里面生成随机数据还有大把的方法, 包括自己写函数或inline code, 结合内置的srf函数等(如generate_series).

海量数据的生成方法、各处场景的压测, 请参考末尾文章.

 

参考

pgbench

https://www.postgresql.org/docs/devel/pgbench.html

 

201711/20171107_48.md 《HTAP数据库PostgreSQL 场景与性能测试之47 - (OLTP多模优化) 空间应用- 高并发空间位置更新、多属性KNN搜索并测(含空间索引)末端配送、新零售类项目》

 

201711/20171107_47.md 《HTAP数据库PostgreSQL 场景与性能测试之46 - (OLTP) 大json字段的高并发更新》

 

201711/20171107_46.md 《HTAP数据库PostgreSQL 场景与性能测试之45 - (OLTP) 数据量与性能的线性关系(10亿+无衰减), 暨单表多大需要分区》

 

201711/20171107_45.md 《[未完待续] HTAP数据库PostgreSQL 场景与性能测试之44 - (OLTP) 空间应用- 空间包含查询(输入多边形包含表内空间对象)》

 

201711/20171107_44.md 《HTAP数据库PostgreSQL 场景与性能测试之43 - (OLTP+OLAP) unlogged table 含索引多表批量写入》

 

201711/20171107_43.md 《HTAP数据库PostgreSQL 场景与性能测试之42 - (OLTP+OLAP) unlogged table 不含索引多表批量写入》

 

201711/20171107_42.md 《HTAP数据库PostgreSQL 场景与性能测试之41 - (OLTP+OLAP) 含索引多表批量写入》

 

201711/20171107_41.md 《HTAP数据库PostgreSQL 场景与性能测试之40 - (OLTP+OLAP) 不含索引多表批量写入》

 

201711/20171107_40.md 《HTAP数据库PostgreSQL 场景与性能测试之39 - (OLTP+OLAP) logged & unlogged table 含索引多表单点写入》

 

201711/20171107_39.md 《HTAP数据库PostgreSQL 场景与性能测试之38 - (OLTP+OLAP) logged & unlogged table 不含索引多表单点写入》

 

201711/20171107_38.md 《HTAP数据库PostgreSQL 场景与性能测试之37 - (OLTP+OLAP) 含索引单表批量写入》

 

201711/20171107_37.md 《HTAP数据库PostgreSQL 场景与性能测试之36 - (OLTP+OLAP) 不含索引单表批量写入》

 

201711/20171107_36.md 《HTAP数据库PostgreSQL 场景与性能测试之35 - (OLTP+OLAP) 含索引单表单点写入》

 

201711/20171107_35.md 《HTAP数据库PostgreSQL 场景与性能测试之34 - (OLTP+OLAP) 不含索引单表单点写入》

 

201711/20171107_34.md 《HTAP数据库PostgreSQL 场景与性能测试之33 - (OLAP) 物联网- 线性字段区间实时统计》

 

201711/20171107_33.md 《HTAP数据库PostgreSQL 场景与性能测试之32 - (OLTP) 高吞吐数据进出(堆存、行扫、无需索引) - 阅后即焚(JSON + 函数流式计算)》

 

201711/20171107_32.md 《HTAP数据库PostgreSQL 场景与性能测试之31 - (OLTP) 高吞吐数据进出(堆存、行扫、无需索引) - 阅后即焚(读写大吞吐并测)》

 

201711/20171107_31.md 《HTAP数据库PostgreSQL 场景与性能测试之30 - (OLTP) 秒杀- 高并发单点更新》

 

201711/20171107_30.md 《HTAP数据库PostgreSQL 场景与性能测试之29 - (OLTP) 空间应用- 高并发空间位置更新(含空间索引)》

 

201711/20171107_29.md 《HTAP数据库PostgreSQL 场景与性能测试之28 - (OLTP) 高并发点更新》

 

201711/20171107_28.md 《HTAP数据库PostgreSQL 场景与性能测试之27 - (OLTP) 物联网- FEED日志, 流式处理与阅后即焚(CTE)》

 

201711/20171107_27.md 《HTAP数据库PostgreSQL 场景与性能测试之26 - (OLTP) NOT IN、NOT EXISTS 查询》

 

201711/20171107_26.md 《HTAP数据库PostgreSQL 场景与性能测试之25 - (OLTP) IN , EXISTS 查询》

 

201711/20171107_25.md 《HTAP数据库PostgreSQL 场景与性能测试之24 - (OLTP) 物联网- 时序数据并发写入(含时序索引BRIN)》

 

201711/20171107_24.md 《HTAP数据库PostgreSQL 场景与性能测试之23 - (OLAP) 并行计算》

 

201711/20171107_23.md 《HTAP数据库PostgreSQL 场景与性能测试之22 - (OLTP) merge insert|upsert|insert on conflict|合并写入》

 

201711/20171107_22.md 《HTAP数据库PostgreSQL 场景与性能测试之21 - (OLTP+OLAP) 排序、建索引》

 

201711/20171107_21.md 《HTAP数据库PostgreSQL 场景与性能测试之20 - (OLAP) 用户画像圈人场景- 多个字段任意组合条件筛选与透视》

 

201711/20171107_20.md 《HTAP数据库PostgreSQL 场景与性能测试之19 - (OLAP) 用户画像圈人场景- 数组相交查询与聚合》

 

201711/20171107_19.md 《HTAP数据库PostgreSQL 场景与性能测试之18 - (OLAP) 用户画像圈人场景- 数组包含查询与聚合》

 

201711/20171107_18.md 《HTAP数据库PostgreSQL 场景与性能测试之17 - (OLTP) 数组相似查询》

 

201711/20171107_17.md 《HTAP数据库PostgreSQL 场景与性能测试之16 - (OLTP) 文本特征向量- 相似特征(海明...)查询》

 

201711/20171107_16.md 《HTAP数据库PostgreSQL 场景与性能测试之15 - (OLTP) 物联网- 查询一个时序区间的数据》

 

201711/20171107_15.md 《HTAP数据库PostgreSQL 场景与性能测试之14 - (OLTP) 字符串搜索- 全文检索》

 

201711/20171107_14.md 《HTAP数据库PostgreSQL 场景与性能测试之13 - (OLTP) 字符串搜索- 相似查询》

 

201711/20171107_13.md 《HTAP数据库PostgreSQL 场景与性能测试之12 - (OLTP) 字符串搜索- 前后模糊查询》

 

201711/20171107_12.md 《HTAP数据库PostgreSQL 场景与性能测试之11 - (OLTP) 字符串搜索- 后缀查询》

 

201711/20171107_11.md 《HTAP数据库PostgreSQL 场景与性能测试之10 - (OLTP) 字符串搜索- 前缀查询》

 

201711/20171107_10.md 《HTAP数据库PostgreSQL 场景与性能测试之9 - (OLTP) 字符串模糊查询- 含索引实时写入》

 

201711/20171107_09.md 《HTAP数据库PostgreSQL 场景与性能测试之8 - (OLTP) 多值类型(数组)含索引实时写入》

 

201711/20171107_08.md 《HTAP数据库PostgreSQL 场景与性能测试之7 - (OLTP) 全文检索- 含索引实时写入》

 

201711/20171107_07.md 《HTAP数据库PostgreSQL 场景与性能测试之6 - (OLTP) 空间应用- KNN查询(搜索附近对象,由近到远排序输出)》

 

201711/20171107_06.md 《HTAP数据库PostgreSQL 场景与性能测试之5 - (OLTP) 空间应用- 空间包含查询(表内多边形包含输入空间对象)》

 

201711/20171107_05.md 《HTAP数据库PostgreSQL 场景与性能测试之4 - (OLAP) 大表OUTER JOIN统计查询》

 

201711/20171107_49.md 《HTAP数据库PostgreSQL 场景与性能测试之3.1 - (OLAP) 大表JOIN统计查询-10亿join 1亿agg》

 

201711/20171107_04.md 《HTAP数据库PostgreSQL 场景与性能测试之3 - (OLAP) 大表JOIN统计查询》

 

201711/20171107_03.md 《HTAP数据库PostgreSQL 场景与性能测试之2 - (OLTP) 多表JOIN》

 

201711/20171107_02.md 《HTAP数据库PostgreSQL 场景与性能测试之1 - (OLTP) 点查》

 

202001/20200103_01.md 《PostgreSQL+MySQL 联合解决方案- 第3课视频- 如何压测PG数据库、如何瞬间构造海量测试数据》

 

201711/20171121_01.md 《PostgreSQL 如何快速构建海量逼真测试数据》

 

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
存储 关系型数据库 MySQL
XtraBackup 的版本大揭秘:突破迷雾,揭开其支持 MySQL 版本的震撼真相,捍卫数据安全!
【8月更文挑战第7天】XtraBackup 是 MySQL 备份领域的热门工具,适用于多个版本。它为 MySQL 8.0 提供高效备份,确保数据安全。同样支持 MySQL 5.7 和其他稳定版如 5.6,精确备份各类数据结构。
117 0
|
7月前
|
存储 关系型数据库 MySQL
太厉害了!华为大牛终于把MySQL讲的明明白白(基础+优化+架构)
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。为面试做了很多准备,收集很多关于MySQL面试题
|
运维 关系型数据库 MySQL
MySQL DBA的必备参考,两位数据库资深专家呕心沥血之作
互联网发展至今,开源软件已经深入人心,并且受到广泛的支持和响应,很多公司在使用开源软件的同时也输出了一些好的开源产品。MySQL 作为当今世界.上最受欢迎的开源数据库产品之一,在很多互联网企业里起到了不可或缺的作用。由于MySQL的诸多特性,比如开源免费、灵活、轻量简单且越来越多的企业开始使用MySQL,在业界诞生了一大批相关从业者,他们研究MySQL的原理,探讨MySQL的架构,完善MySQL的运维,丰富MySQL的工具,促进MySQL的发展,我们称这些人为MySQL DBA,而本人也是其中之一,深感荣幸。
|
SQL 存储 NoSQL
个人眼中关于当下数据库的看法
当下主流数据库,哪个最火?这是一个备受关注的话题。目前,主流数据库主要有关系型数据库和NoSQL数据库。关系型数据库是目前应用最广泛的数据库,而NoSQL数据库则是近年来发展很快的新型数据库。接下来将以MongoDB等NoSQL数据库为例,探讨其优势和适用场景。
248 1
个人眼中关于当下数据库的看法
|
SQL 存储 数据库
华为数据库工程师面试题目
华为数据库工程师面试题目
118 0
阿里大牛撰写"星耀级"MySQL DBA工作笔记!颠覆我对数据库的认知
MySQL是开源数据库方向的典型代表,它拥有成熟的生态体系,同时在可靠性、性能、易用性方面表现出色,它的发展历程见证了互联网的兴衰与成长。 在 DeveloperWeek 上曾发起一个调查,超过 3/5 的受访者使用 SQL,其中MySQL 以 38.9% 的使用率高居榜首,其后依次是 MongoDB(24.6%)、PostgreSQL(17.4%)、Redis(8.4%)和 Cassandra(3.0%)。毫无疑问,以MySQL为主的开源技术生态正变得越来越流行。同样的,对我们掌握MySQL也迫在眉睫。那么,接下来,就让小轩带领大家来深入了解MySQL吧!
|
Oracle 关系型数据库 数据库
炫“库”行动-人大金仓有奖征文—谈谈oracle建表规范
今天突然想把工作几年在oracle建表相关的知识整理成一个像样的文档分享给大家,为达到数据库开发规范、后期维护方便等目的编写此篇文章,希望大家能重视数据库建表这个“小小的问题”,从小处见大学问,欢迎大家一起讨论。
225 0
|
存储 SQL 监控
老叶观点:MySQL开发规范之我见(更新版)
老叶观点:MySQL开发规范之我见(更新版)
160 0
|
存储 SQL 监控
老叶观点:MySQL开发规范之我见
老叶观点:MySQL开发规范之我见
132 0
|
存储 负载均衡 搜索推荐
【重新发现PostgreSQL之美】- 23 彭祖的长寿秘诀
大家好,这里是重新发现PostgreSQL之美 - 23 彭祖的长寿秘诀