Еще на позапрошлых выходных плохо спал, рано проснулся и решил сделать визуализацию для результатов работы 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 |
А хотелось бы чтобы такой график формировался сразу.
Погуглил – интернет рекомендует использовать утилиту gnuplot. Его нужно установить. В Ubuntu сделать это очень просто:
sudo apt install gnuplot
А далее уже нужно разбираться с тем, как работать с gnuplot. Но это не цель статьи, так что я просто дам несколько ссылок на интересные статьи, которые сам читал:
- Хабр. Gnuplot и с чем его едят
- AslfModa. Основы работы в Gnuplot
- Classmech. Основы GNUPLOT [презентация PDF]
- Of.site. gnuplot demo script: transparent.dem [наложение графиков]
- Bersch. Filledcurves
- Molphys. Spectrum plots [графики с заполнением]
- Stackoverflow. Plotting two axes in 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-таблицы:
Ну и пару замечаний: я использую Filledcurves – заполненные кривые линии. Это должны быть замкнутыми фигурами, чтобы можно было их заполнить. Поэтому я добавляю ноль в начало и в конец наборов данных – тогда фигура точно получится заполненной.
Если этого не делать и данные будут так «неудачно» распределены, что из них не получится замкнутная фигура – тогда график получиться очень не очень (для тех же данных, только без нулей):
В первой строке файла gn_graph.gpi нужно указать путь до gnuplot’a:
#! /usr/bin/gnuplot -persist
Этот путь можно узнать с помощью команды:
which gnuplot
Ключ -persist полезен когда вы не сохраняете график в файл, а используете внутреннюю оболочку для вывода графиков. С ключом -persist график будут отображаться даже после того, как вы закроете gnuplot.
Последняя строка в файле gn_graph.gpi – вывод графика без заполнения, только линии. Можно предыдущую строку закомментировать, последнюю закомментировать – результат будет такой:
Познакомился с интересным инструментом – gnuplot.
Следующий мой шаг – сделать настройку отрисовки графиков более универсальной. Сейчас график заточен под 113 строк в данных. Хочу чтобы и для четырех строк, и для четырехсот рисовался правильный по размеру график.
Leave a Reply