背景
有数据说数据, 没数据说案例, 没案例说逻辑, 没逻辑谈理想. 已经成为数字时代的职场生存法则.
• 要陈述一个观点或结论, 没有数据支撑说话没分量, 说明你没经过仔细分析, 没过脑子.
• 实在拿不到数据, 你总得拿点案例出来, 否则就是在空谈, 没有支点.
• 没案例, 总得有底层逻辑吧, 逻辑能自洽, 也是说得通的.
• 如果连逻辑都没有想过, 那你只能用故事、理想或者理念来感染人, 如果你能忽悠(感染)成功, 并且最后确实也成功了, 也许能表达为因为相信所以看见.
场景:
• 项目上线前, 申请资源, 如何评估需要多少资源?
• 做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 如何快速构建海量逼真测试数据》