Работа с Python в SQ Server 2017. Часть 2

Ранее в статьях Работа с Python в SQ Server 2017. Введение и Работа с Python в SQL Server 2017. Часть 1 мы рассмотрели основы и начало работы с Python в SQL Server. Сегодня мы продолжаем тему, связанную с использованием Python в SQL Server.

Здесь мы посмотрим на различные варианты кода, исполняемого на системе Python/SQL Server.

Прежде всего обратимся из скрипта, написанного для языка Python, к SQL Server и выполним запрос. Для этого предопределенной системной переменной InputDataSet передадим текст запроса, написанный на Transact-SQL, а далее присвоим эту переменную также предопределенной системной переменной OutputDataSet. Переменная OutputDataSet возвращает результирующий набор вызывающей программе (SQL Server). В результате будет выполнен запрос и возвращен результат, показанный ниже.

1.jpg

Для выполнения той же задачи возможен другой подход, использующий для промежуточного хранения и обработки в Python объект DataFrame библиотеки Pandas. В данном случае мы импортируем библиотеку pandas и заполняем объект DataFrame данными из запроса, переданного переменной InputDataSet. Как видно из рисунка, мы получили тот же результат, но смогли передать данные из SQL Server в код Python.

2.jpg

В нижеприведенном примере мы выполняем запрос к SQL Server и передаем результат для обработки в Python, который рассчитывает медиальное, среднеарифметическое, среднеквадратичное, минимальное и максимальное значение. На основании этих значений формируется выходной набор данных. Обратите внимание, что появилось новое предложение “WITH RESULT SETS”, которое определяет выходной набор данных, а именно имена столбцов и типы данных SQL Server.

Примечание: Код, который вы видите ниже, можно было написать, значительно короче, но он так написан для упрощения понимания.

3.jpg

Давайте протестируем, сколько времени тратит Python на выполнение этой операции, и сколько потратит SQL Server, рассчитывая те же значения, но используя оптимизацию, встроенную в ядро SQL Server.

Для этого выполним скрипт Python, добавив SET STATISTICS TIME ON/OFF для измерения времени выполнения.

И так, Python…

4.jpg

Общее потраченное время составляет 632 милисекунды. 

5.jpg

Выполним, ту же процедуру для Transact-SQL.

6.jpg

Общее потраченное время составляет 277 милисекунд, что значительно меньше. 

12.jpg

И что из этого следует? Не использовать Python?

Вывод не верный. Просто приведенные виды расчетов достаточно хорошо оптимизированы на SQL Server, и поэтому он победил, однако для более изощренных видов статистического анализа Transact-SQL либо окажется значительно медленнее, либо вообще не пригоден. А учитывая огромное количество библиотек статистического анализа, реализованных для Python, вы можете проводить практически любы виды статистической обработки данных.

Какой отсюда вывод. А вывод такой. Прежде чем реализовывать решение его надо тщательно тестировать.

В следующем нашем эксперименте создадим универсальную хранимую процедуру и будем ей передавать запрос для проведения вычислений.

В данном случае мы присваиваем запрос входной переменной @input_data_1, имя которой предопределено, а внутри SQL Server эта переменная связана с InputDataSet, в результате чего выполняется запрос в конструкторе pd.DataFrame(InputDataSet).

7.jpg

Далее вызываем хранимую процедуру, передавая ей разные тексты запросов.

8.jpg

Продолжаем рассмотрение вопросов использования Python из-под SQL Server.

Следующий вопрос связан с визуализацией статистических расчетов в виде графических объектов Python, которых в нем огромное количество.

В примере, показанном ниже, мы строим объект plt и далее сохраняем его как изображение в формате png. Для того чтобы изображение сохранялось при каждом выполнении мы добавляем в строку с датой и временем в имя файла.

Таким образом можно экспортировать рисунки в различных форматах.

9.jpg

Здесь показана возможность импорта (загрузки) внешних данных, сохраненных в виде файла в таблицу SQL Server. Вставка данных осуществляется позиционным принципом.

10.jpg

Просмотрим результат.

11.jpg

 В следующей статье мы рассмотрим вопросы связанные с мониторингом и решением проблем подсистемы Python / SQL Server.

Александр Каленик, Senior Premier Field Engineer (PFE), MSFT (Russia)