天天看點

【重新發現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,    

  buckets,    

  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)  

      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 % | *  

 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 指數分布

\set id random_exponential(1,100,3.0)  

 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 %  | *  

threshold > 0

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

threshold 越接近0,則越趨于随機分布,而不是指數分布。

長尾分布

\set id random_zipfian(1, 100, 1.001)  

 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 %  |   

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

201711/20171121_01.md