Формирование графика после выполнения Join Order Benchmark

PostgreSQLЕще на позапрошлых выходных плохо спал, рано проснулся и решил сделать визуализацию для результатов работы Join Order Benchmark. Хотел чтобы графики появлялись сразу после отработки бенчмарка. Раньше я времена планирования и выполнения копировал, там менял точку на запятую, вставлял в гуглотаблицу и формировал график.

Напомню как этот график выглядел для тех результатов, которые были получены в прошлый раз:

Результаты моего запуска:

PlanTime ExecTime
1 2.796 151.13
2 1.954 75.577
3 1.793 82.014
4 1.785 77.022
5 1.856 2023.429
6 2.666 660.542
7 2.595 562.513
8 8.445 1122.937
9 1.742 799.924
10 2.033 142.912
11 6.675 831.726
12 2.554 151.5
13 8.303 124.528
14 2.058 152.515
15 9.316 149.837
16 2.013 116.359
17 2.174 222.239
18 2.315 80.397
19 2.332 392.906
20 2.587 13.392
21 2.281 19865.777
22 5.273 28.747
23 2.316 8913.507
24 9.11 0.154
25 5.624 0.139
26 6.405 0.136
27 3.949 0.127
28 3.689 0.129
29 4.013 0.15
30 4.231 0.151
31 7.548 0.153
32 8.086 0.17
33 7.681 0.33
34 7.466 0.161
35 5.332 3948.828
36 14.49 256.13
37 4.655 21863.245
38 18.413 1118.496
39 5.842 32.143
40 7.332 1123.263
41 6.682 188.742
42 9.718 2502.828
43 8.957 87.616
44 7.501 5191.212
45 12.289 3220.687
46 13.431 492.77
47 14.293 470.69
48 12.07 3456.559
49 11.272 4786.653
50 7.219 213.807
51 7.346 1310.402
52 20.15 448.781
53 17.933 28.445
54 17.837 2774.714
55 19.324 1177.277
56 16.079 1142.521
57 8.875 5.484
58 7.423 4.531
59 7.348 7578.27
60 11.115 57248.93
61 6.845 15389.786
62 6.2 9770.052
63 5.594 9769.129
64 5.374 13549.286
65 24 11868.584
66 9.843 14055.789
67 6.747 1156.89
68 5.966 8221.037
69 35.273 0.216
70 23.709 0.304
71 27.814 0.463
72 28.628 0.201
73 19.325 19338.165
74 17.384 9989.327
75 23.585 2185.361
76 23.767 186.356
77 23.379 88.299
78 19.433 111.482
79 67.394 4037.798
80 43.659 388.092
81 45.339 6466.44
82 65.024 5174.291
83 41.068 1099.025
84 40.744 147.478
85 41.109 10995.183
86 76.932 0.953
87 66.587 0.2
88 42.106 21197.005
89 16.557 254.856
90 16.627 24918.032
91 102.963 59844.804
92 66.276 850.359
93 67.635 20258.037
94 79.989 102.878
95 67.966 8.742
96 67.201 53.91
97 86.658 1872.11
98 83.361 1792.454
99 87.428 679.013
100 104.021 0.293
101 94.324 0.237
102 102.824 0.241
103 75.006 1060.153
104 69.682 324.781
105 72.273 7823.968
106 62.41 1409.851
107 59.602 296.599
108 60.627 1316.261
109 3.369 14.854
110 2.338 200.487
111 101.152 43.329
112 80.52 21.112
113 80.84 100.903

[свернуть]

Получившийся график:

Join_Order_Benchmark_PlanTime_ExecTime
Join_Order_Benchmark_PlanTime_ExecTime

[свернуть]

А хотелось бы чтобы такой график формировался сразу.

Погуглил – интернет рекомендует использовать утилиту gnuplot. Его нужно установить. В Ubuntu сделать это очень просто:

sudo apt install gnuplot

А далее уже нужно разбираться с тем, как работать с gnuplot. Но это не цель статьи, так что я просто дам несколько ссылок на интересные статьи, которые сам читал:

Я пропущу процесс поиска правильных настроек скрипта для рисования графиков. Получилось нарисовать то, что мне нужно далеко не с первого раза и не за один день. Да и то, цвета ещё не полностью меня удовлетворяют. Но и такие тоже хорошие.

Но теперь всё работает, так что уже не стыдно и показать.

Весь код находится в моём репозитарии на github: query_runner.

Я добавил туда файл gn_graph.gpi. Это скрипт с настройками gnuplot’a. В нём я формирую оси, указываю цвет, беру время планирования и выполнения, отображаю их на графике и сохраняю его в файл PE_Time.jpeg.

Так что скрипт файл gn_graph.gpi можно запускать отдельно, с вашими данными.

В основной скрипт query_run.sh я добавил строку удаления предыдущего графика, удаление первой и последней строки в файлах с временем результата (чуть позже объясню зачем) и строку вызова скрипта gnuplot’a:

gnuplot -e "load 'gn_graph.gpi'"

В результате получаю вот такую картинку:

Мой итоговый график

И сравним с тем, что было получено в прошлый раз с помощью Google-таблицы:

Join_Order_Benchmark_PlanTime_ExecTime
Join_Order_Benchmark_PlanTime_ExecTime

Ну и пару замечаний: я использую Filledcurves – заполненные кривые линии. Это должны быть замкнутыми фигурами, чтобы можно было их заполнить. Поэтому я добавляю ноль в начало и в конец наборов данных – тогда фигура точно получится заполненной.

Если этого не делать и данные будут так «неудачно» распределены, что из них не получится замкнутная фигура – тогда график получиться очень не очень (для тех же данных, только без нулей):

Не замкнутая фигура

В первой строке файла gn_graph.gpi нужно указать путь до gnuplot’a:

#! /usr/bin/gnuplot -persist

Этот путь можно узнать с помощью команды:

which gnuplot

Ключ -persist полезен когда вы не сохраняете график в файл, а используете внутреннюю оболочку для вывода графиков. С ключом -persist график будут отображаться даже после того, как вы закроете gnuplot.

Последняя строка в файле gn_graph.gpi – вывод графика без заполнения, только линии. Можно предыдущую строку закомментировать, последнюю закомментировать – результат будет такой:

Только линии без заливки

Познакомился с интересным инструментом – gnuplot.

Следующий мой шаг – сделать настройку отрисовки графиков более универсальной. Сейчас график заточен под 113 строк в данных. Хочу чтобы и для четырех строк, и для четырехсот рисовался правильный по размеру график.


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*