10

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は最適ではないように見えます。

4

1 に答える 1

2

複数の値を持つ特殊な INSERT がサポートされるようになったのは最近 (0.8 未リリース) になったようです。

http://docs.sqlalchemy.org/ru/latest/core/expression_api.html#sqlalchemy.sql.expression.Insert.values

これは、表示されるパフォーマンスの違いを説明するはずです。開発バージョンをインストールし、リンクに記載されている呼び出し構文を変更してテストを繰り返して確認することができます。

于 2013-02-06T06:08:06.130 に答える