Если вы не можете использовать COPY
из S3 и должны полагаться на DML, вы можете попробовать передать use_batch_mode=True
в create_engine()
:
engine = create_engine('theurl', use_batch_mode=True)
На этой машине простая вставка 500 строк в кластер Redshift показала разумное улучшение при включенном пакетном режиме:
In [31]: df = pd.DataFrame({'batchno': range(500)})
In [32]: %time df.to_sql('batch', engine, index=False, if_exists='append')
CPU times: user 87.8 ms, sys: 57.6 ms, total: 145 ms
Wall time: 1min 6s
In [33]: %time df.to_sql('batch', bm_engine, index=False, if_exists='append')
CPU times: user 10.3 ms, sys: 4.66 ms, total: 15 ms
Wall time: 9.96 s
Обратите внимание, что версии Pandas 0.23.0 и 0.24.0 и выше не принесут пользыиз пакетного режима, так как они используют вставку нескольких значений вместо executemany, если базовая СУБД поддерживает это.Использование вставки нескольких значений должно обеспечить несколько аналогичные улучшения пропускной способности, поскольку выдается меньше запросов.