Azure Cloud SQL – Запрос большого количества строк с помощью Python

Вопрос или проблема

У меня есть приложение на Python Flask, которое подключается к базе данных Azure Cloud SQL и использует метод Pandas read_sql с SQLAlchemy для выполнения операции выбора из таблицы и загрузки данных в dataframe.

recordsdf = pd.read_sql(recordstable.select(), connection)

В таблице recordstable около 5000 записей, и выполнение функции занимает около 10 секунд (мне нужно извлекать все записи каждый раз). Тем не менее, точно такая же операция с теми же данными занимает около 0.5 секунд, когда я выбираю данные из локальной базы данных SQL Server.

Что я могу сделать, чтобы сократить время загрузки данных из Azure в dataframe? Поможет ли перенос всего приложения на Python на сервер без серверов Azure? Спасибо

Дополнительная информация

  • База данных Azure находится на стандартном уровне с 20 DTU
  • Регион базы данных настроен так, чтобы быть ближе к моему местоположению
  • В идеале я хочу, чтобы операция выполнялась менее чем за 2 секунды

У вас есть несколько этапов процесса извлечения данных: время подключения, время загрузки и время обработки базы данных.

Если вы сохраните свои данные в файле csv в хранилище blob, время обработки будет быстрее (по сути, нулевым). Таким образом, каждый день вы могли бы сохранять данные из базы данных в файл csv, а затем получать доступ к файлу, когда вам это нужно.

Azure без серверов сократит время подключения и время загрузки (если ваше интернет-соединение медленное), но не сократит время обработки базы данных.

Ответ или решение

Оптимизация запросов к Azure Cloud SQL с использованием Python и Pandas

Ваша ситуация с медленной загрузкой данных из Azure Cloud SQL в DataFrame с помощью библиотеки Pandas действительно требует оптимизации. Прежде всего, давайте рассмотрим основные этапы получения данных и возможные пути повышения производительности.

Этапы получения данных

  1. Установление соединения: Время, необходимое для установления соединения с базой данных.
  2. Обработка запросов: Время, затрачиваемое SQL Server на выполнение запроса и возвращение результатов.
  3. Скачивание данных: Время на передачу данных из базы данных в ваше приложение.

Возможные решения

1. Оптимизация SQL-запроса

Убедитесь, что ваш SQL-запрос оптимизирован. Для этого выполните следующие действия:

  • Индексация таблиц: Проверьте, используются ли индексы для колонок, по которым осуществляется фильтрация или сортировка данных.
  • Выборочная выборка: Если вы всегда извлекаете 5000 записей, подумайте о возможности загружать данные порциями или только те записи, которые действительно нужны (например, используя LIMIT или фильтры).
Пример:
# Вместо получения всех записей можно получить, например, только те, что нужны
query = recordstable.select().limit(1000)  # Загружайте по 1000 записей.
recordsdf = pd.read_sql(query, connection)
2. Рабочие нагрузки и DTU

Рассмотрите возможность увеличения DTU (Database Transaction Units) вашей базы данных. Текущий стандартный уровень с 20 DTU может быть недостаточным для вашей рабочей нагрузки, особенно если на базе работают другие приложения.

3. Хранение данных в Blob Storage

Если вы работаете с большими объемами данных и производительность критична, то стоит рассмотреть возможность сохранения выходных данных в массив CSV-файлов в Azure Blob Storage. Такой подход позволяет существенно снизить время на обработку данных. Вы можете заполнять CSV-файлы ночными задачами и загружать их, когда это необходимо.

Пример записи в CSV:

# Сохранение данных в CSV
recordsdf.to_csv('data.csv', index=False)
4. Использование Azure Functions или Azure Logic Apps

Перенос вашей Python Flask приложения на серверless-архитектуру, такие как Azure Functions, может повысить производительность за счет уменьшения времени ожидания соединения, хотя выполнение запросов к базе данных останется неизменным. Если ваша инфраструктура согласуется с серверless-решением и при этом не требует постоянного вычислительного времени, тот подход может быть выгодным.

5. Использование Efficient Data Transfer Techniques

При работе с большими объемами данных стоит рассмотреть такие методы, как:

  • Compression: Использование сжатия при передаче данных может сократить время загрузки, особенно если у вас ограниченная пропускная способность.
  • Batching: Разделение больших запросов на меньшие пакеты, которые обрабатываются параллельно.

Заключение

Если вы стремитесь уменьшить время запроса данных из Azure Cloud SQL до менее 2 секунд, вам следует рассмотреть узкие места на каждом из этапов получения данных. Оптимизация запросов, анализ нагрузки и продумывание хранения данных в Blob Storage — ключевые подходы к решению вашей задачи.

Тщательная реализация предложенных методов может значительно улучшить производительность вашего приложения и обеспечить более быстрое реагирование на клиентские запросы.

Оцените материал
Добавить комментарий

Капча загружается...