Еще на позапрошлых выходных плохо спал, рано проснулся и решил сделать визуализацию для результатов работы 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