У меня есть сервер Postgres (10.2) на AWS RDS (m4.large 2vCPU, 8 ГБ памяти) со стандартными настройками (кроме отключенной синхронной фиксации), и любые виды вставок SQLALchemy невероятно медленны по сравнению с локальным SQLite на моемноутбук.
Я запустил скрипт производительности, найденный в официальных документах SQLAlchemy , см. внизу страницы.
По сути, сценарий создает таблицу Customer
с первичным целочисленным ключом id
и строковым столбцом name
.Сценарий просто вызывает "INSERT INTO customer (name) VALUES (?)"
различными способами, чтобы вставить 1000 строк.
И результаты действительно потрясающие для установки AWS, которая стоит почти 200 долларов США в месяц:
Результаты SQLite:
SQLAlchemy ORM: общее время для 1000 записей 0,17040562629699707 секунд
SQLAlchemy ORM задано pk: общее время для 1000 записей 0,08621740341186523 секунд
SQLAlchemy ORM bulk_save_object:Общее время для 1000 записей 0,027913570404052734 секунд
SQLAlchemy ORM bulk_insert_mappings (): общее время для 1000 записей 0,014255523681640625 секунд
SQLAlchemy Core: общее время для 1000 записей 0,010448455810546875 сек ** Результаты AWS Postgres :
SQLAlchemy ORM: общее время для 1000 записей 18.51957869529724 секунд
SQLAlchemy ORM задано pk: общее время для 1000 записей 18.049689054489136 секунд
SQLAlchemy ORM bulk_save_objects (): общее время для 1000 записей 18.0506489276886 с
SQLAlchemy ORM bulk_insert_mappings (): общее время для 1000 записей. 17,969014644622803 сек.
SQLAlchemy Core: общее время для 1000 записей.намного медленнее, основной даже более чем в 1000 раз.Это проблема конфигурации Postgres?Моя сетевая задержка не может быть такой плохой :-).Спасибо!
РЕДАКТИРОВАТЬ:
Благодаря @Laurenz, я использовал pg_stat_statements
для исследования, и время запроса полностью подходит.Я подозреваю, что это проблема с сетью.Более того, я запустил небольшой экземпляр EC2 в том же VPC, что и база данных, и снова запустил сценарий производительности: там производительность на несколько порядков выше (только в 5-20 раз медленнее, чем SQLite, но это то, что я ожидал).
Есть идеи, как решить эту проблему?Что может быть причиной для этого?Я имею в виду, что 1000 строк с небольшим количеством строковых данных - это не много с точки зрения байтов, которые должны быть переданы через Интернет.Кто-нибудь еще сталкивался с такой же проблемой с базами данных AWS, живущими в VPC?