SQLA-Expression-Languageステートメントを介してMySQL-DBに複数の行を挿入する場合、fe
Foo.__table__.insert().execute([{'bar': 1}, {'bar': 2}, {'bar': 3}])
同じタスクの「生の」SQLステートメントの実行と比較すると、非常に低速です。
engine.execute("insert into foo (bar) values (1),(2),(3)")
これの理由は何ですか?SQLAは単一の一括挿入ステートメントを生成できないため、複数の挿入を実行できませんか?ormの速度制限のため、一度に数千行を追加する高速な方法が必要ですが、SQLA-Expression-Language-Versionは遅すぎます。だから、私は自分で生のSQLを書く必要がありますか?ドキュメントはこれについてあまり明確ではありません。
ORMインサート、PKが事前に割り当てられたORM、およびSQLAバルクインサート(SQLAバルクインサート速度を参照)を使用して、次のように速度テストを実行しました(https://gist.github.com/3341940)。
- SqlAlchemy ORM:500レコードの合計時間9.61418914795秒
- 指定されたSqlAlchemyORMpk:500レコードの合計時間9.56391906738秒
- SqlAlchemy Core:500レコードの合計時間9.5362598896秒
- SQLAlchemy RAW文字列実行:500レコードの合計時間1.233677秒
ご覧のとおり、3つのバージョンの間に実質的な違いはありません。すべてのレコードが生のSQLステートメントに含まれている生の文字列挿入の実行のみが大幅に高速化されます。したがって、高速挿入の場合、SQLAは最適ではないように見えます。