Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Technical Portfolio
GitHub & GitVerse Pages

Бенчмаркинг SQL-запросов

SQL Lab in JupyterLab

Data & BI Analyst

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 ms

Wall time (астрономическое время) – это фактическое время от нажатия Shift+Enter до вывода результата в интерфейс.


Особенности и выводы

  1. Несмотря на возможность использования встроенной магии %%time, в проекте задействован плагин jupyterlab_execute_time – чтобы фиксация времени выполнения запроса происходила автоматически.

  2. Единственный нюанс плагина jupyterlab_execute_time – время отображается в интерфейсе Jupyter, но не переносится в статическую верстку сайта Jupyter Book (в отличие от вывода команды %%time).
    Этот момент аналогичен отсутствию на собранном сайте подсветки синтаксиса MySQL в ячейках %%sql, о чем упомянуто в разделе Создание таблицы Главы 2

  3. Время, которое фиксируют %%time и jupyterlab_execute_time – это полное время жизненного цикла ячейки:

    • формирование и отправка запроса через Python и драйвер PyMySQL в базу данных;

    • исполнение запроса на стороне сервера MySQL;

    • передача результирующей выборки обратно в Python и ее преобразование в табличный вид.

    Для локальной учебной базы (Sakila) эти накладные расходы минимальны, однако чистое время исполнения на сервере (показываемое в MySQL CLI) всегда будет немного меньше общего времени выполнения ячейки.