【发布时间】:2018-01-11 01:21:20
【问题描述】:
我正在通过this article 了解 sqlalchemy 批量插入性能。我尝试了基准测试中指定的各种方法 - SQLAlchemy ORM bulk_insert_mappings()、SQLAlchemy Core。不幸的是,对于插入 1000 行,所有这些方法都需要大约 1 分钟来插入它们。这是非常缓慢的。我还尝试了here 指定的方法 - 这需要我构建一个大型 SQL 语句,例如:
INSERT INTO mytable (col1, col2, col3)
VALUES (1,2,3), (4,5,6) ..... --- up to 1000 of these
这个原始 SQL 的插入是这样的:
MySession.execute('''
insert into MyTable (e, l, a)
values {}
'''.format(",".join(my_insert_str)))
使用这种方法,我在 10-11 秒内将性能提高了 50 倍以上,达到 10000 次插入。
这是使用内置库的方法的代码。
class MyClass(Base):
__tablename__ = "MyTable"
e = Column(String(256), primary_key=True)
l = Column(String(6))
a = Column(String(20), primary_key=True)
def __repr__(self):
return self.e + " " + self.a+ " " + self.l
.......
dict_list = []
for i, row in chunk.iterrows():
dict_list += [{"e" : row["e"], "l" : l, "a" : a}]
MySession.execute(
Myclass.__table__.insert(),
dict_list
)
这是我连接到数据库的方式。
params = urllib.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=servername;DATABASE=dbname;UID=user;PWD=pass")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params )
MySession.configure(bind=engine, autoflush=False, expire_on_commit=False)
我的设置是否存在大幅降低性能的问题?我尝试使用不同的数据库驱动程序 - pyodbc 和 pymssql。无论我尝试什么,我都无法接近他们在文章中声称的数字:
SQLAlchemy ORM: Total time for 100000 records 2.192882061 secs
SQLAlchemy ORM pk given: Total time for 100000 records 1.41679310799 secs
SQLAlchemy ORM bulk_save_objects(): Total time for 100000 records 0.494568824768 secs
SQLAlchemy ORM bulk_insert_mappings(): Total time for 100000 records 0.325763940811 secs
SQLAlchemy Core: Total time for 100000 records 0.239127874374 secs
sqlite3: Total time for 100000 records 0.124729156494 sec
我正在连接到 MS SQL Server 2008。如果我遗漏了任何其他详细信息,请告诉我。
原始 SQL 方法的问题在于它不是 SQL 注入安全的。因此,或者,如果您有解决此问题的建议,它也会非常有帮助:)。
【问题讨论】:
-
我建议你阅读:seldo.com/weblog/2011/08/11/orm_is_an_antipattern,只是提一下;)
-
我更建议阅读 github.com/mkleehammer/pyodbc/issues/120,这是一个关于 pyodbc 的长期问题,并且对于大型插入而言,
executemany()的性能极其缓慢。 ORM 有自己的位置,尽管批量数据处理不是其中之一。
标签: python sql-server performance sqlalchemy bulkinsert