Abstract¶
Как реализовать автоматический вывод времени выполнения SQL-запросов в JupyterLab, чтобы воспроизвести поведение консольного клиента MySQL CLI.
Бенчмаркинг в SQL
Это замер скорости выполнения запросов для оценки их эффективности. Мы фиксируем время работы каждой ячейки, чтобы наглядно сравнивать альтернативные варианты SQL-кода (например, работу JOIN против подзапроса).
Автозамер: JupyterLab Execute Time¶
В текущей версии JupySQL класс SqlMagic не содержит встроенного флага для логирования времени выполнения самой СУБД. Однако в документации предлагается решение через официальное расширение jupyterlab_execute_time, которое автоматически отображает время выполнения внизу каждой ячейки.
В репозитории расширения указано, что плагин можно установить через conda. В истории релизов актуальная версия – 3.3.0 от 23 дек. 2025 г. ОК.
Однако при проверке доступных версий в канале conda-forge оказывается, что последняя доступная там сборка – 3.2.0 от 13 сен. 2024 г.:
conda search -c conda-forge --override-channels jupyterlab_execute_time
# Name Version Build Channel
jupyterlab_execute_time 2.0.1 pyhd8ed1ab_0 conda-forge
... ... ... ...
jupyterlab_execute_time 3.2.0 pyhd8ed1ab_1 conda-forgeТо есть разработчики опубликовали версию 3.3.0 на PyPI, но до сих пор не обновили рецепт в conda-forge, где все еще лежит билд 3.2.0.
Чтобы установить актуальную версию, придется использовать менеджер pip
conda activate ds-book
pip install jupyterlab_execute_timeТак в итоговом файле environment.yml появляется секция pip.
Весьма вероятно
что вам не потребуется постоянный вывод времени исполнения запроса. Тем более что можно точечно использовать встроенную магию %%time.
Однако цель интеграции плагина в проект – чтобы вывод ячеек в интерфейсе Jupyter максимально соответствовал по информативности выводу консольного клиента MySQL CLI со страниц книги Алана Болье.
Ручной замер: магия %%time¶
Поскольку JupySQL работает внутри Jupyter, мы можем комбинировать магические команды. Стандартная встроенная команда %%time замеряет время выполнения всей ячейки. Единственное условие: %%time всегда должна объявляться в ячейке первой строкой, перед %%sql.
В качестве примера команда %%time использована в подразделе Условия неравенства Главы 4:
%%time
%%sql
SELECT c.email
FROM customer c
INNER JOIN rental r
ON c.customer_id = r.customer_id
WHERE date(r.rental_date) = '2005-06-14';16 rows affected.
CPU times: total: 0 ns
Wall time: 45 msWall time (астрономическое время) – это фактическое время от нажатия Shift+Enter до вывода результата в интерфейс.
Особенности и выводы¶
Несмотря на возможность использования встроенной магии
%%time, в проекте задействован плагинjupyterlab_execute_time– чтобы фиксация времени выполнения запроса происходила автоматически.Единственный нюанс плагина
jupyterlab_execute_time– время отображается в интерфейсе Jupyter, но не переносится в статическую верстку сайта Jupyter Book (в отличие от вывода команды%%time).
Этот момент аналогичен отсутствию на собранном сайте подсветки синтаксиса MySQL в ячейках%%sql, о чем упомянуто в разделе Создание таблицы Главы 2Время, которое фиксируют
%%timeиjupyterlab_execute_time– это полное время жизненного цикла ячейки:формирование и отправка запроса через Python и драйвер
PyMySQLв базу данных;исполнение запроса на стороне сервера MySQL;
передача результирующей выборки обратно в Python и ее преобразование в табличный вид.
Для локальной учебной базы (Sakila) эти накладные расходы минимальны, однако чистое время исполнения на сервере (показываемое в MySQL CLI) всегда будет немного меньше общего времени выполнения ячейки.