Вопрос или проблема
У меня есть приложение на 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 действительно требует оптимизации. Прежде всего, давайте рассмотрим основные этапы получения данных и возможные пути повышения производительности.
Этапы получения данных
- Установление соединения: Время, необходимое для установления соединения с базой данных.
- Обработка запросов: Время, затрачиваемое SQL Server на выполнение запроса и возвращение результатов.
- Скачивание данных: Время на передачу данных из базы данных в ваше приложение.
Возможные решения
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 — ключевые подходы к решению вашей задачи.
Тщательная реализация предложенных методов может значительно улучшить производительность вашего приложения и обеспечить более быстрое реагирование на клиентские запросы.