python - sqlalchemy bulk_insert_mappings 生成大量插入批处理,这是可以避免的吗?

标签 python database performance optimization sqlalchemy

我有大量对象需要通过 sqlalchemy 插入到 Oracle 数据库中。

使用单独的插入需要相当长的时间来执行。在四处搜索之后,很明显有更高效的批量插入方法,bulk_insert_mappings、bulk_save_objects 等。这些方法比单独的插入执行得更好。但是,我注意到他们似乎将插入内容分成大约 8 个左右的组。是否可以将批量大小增加到 1000 左右?

我一直在使用的性能文档是:http://docs.sqlalchemy.org/en/latest/faq/performance.html

render_nulls 标志似乎没有效果。 如果有帮助,我正在使用 cx_Oracle 驱动程序。

额外引用:

session.bulk_insert_mappings(MY_OBJECT, my_object_dicts_for_insert)

生成大约 len(my_object_dicts_for_insert)/8 条语句,由“after_cursor_execute”事件衡量。有没有办法从 sqlalchemy 或数据库中调整此行为?

谢谢!

最佳答案

发现了问题,这是我对 render_nulls 标志的理解。

根据描述,我认为如果提供了具有不同键的字典列表,那么它们将被填充空值以允许单个插入语句。

这不是它的工作方式,您必须确保您的词典列表具有相同的键,并且您用 None 填充未使用的字段。然后当 render_nulls 设置为 True 时,空值将被插入到具有 None 值的列中,允许单个插入语句。

例子:

# This results in 2 inserts
my_objects = [{'a': 1, 'b': 2}, {'a': 1}]
session.bulk_insert_mappings(MY_OBJECT, my_objects, render_nulls=True)

# This results in 2 inserts
my_objects = [{'a': 1, 'b': 2}, {'a': 1}]
session.bulk_insert_mappings(MY_OBJECT, my_objects, render_nulls=False)

# This results in 2 inserts
my_objects = [{'a': 1, 'b': 2}, {'a': 1, 'b': None}]
session.bulk_insert_mappings(MY_OBJECT, my_objects, render_nulls=False)

# This results in 1 insert - BETTER PERFORMANCE
my_objects = [{'a': 1, 'b': 2}, {'a': 1, 'b': None}]
session.bulk_insert_mappings(MY_OBJECT, my_objects, render_nulls=True)

这会带来可观的性能提升,对我来说,性能提高了大约 10 倍。

请注意,使用 render_nulls 时可能会产生副作用,请阅读此处的文档:http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.bulk_insert_mappings

如果你不能使用 render_nulls 标志,不能用 None 填充你的字典,或者不想增加发送空值的带宽,你可以通过按字典的键集。

例子:

# This will result in 2 inserts - BETTER PERFORMANCE
my_objects = [{'a': 1, 'b': 2}, {'a': 2, 'b': 3}, {'a': 4}]
session.bulk_insert_mappings(MY_OBJECT, my_objects)
# This will result in 3 inserts
my_objects = [{'a': 1, 'b': 2}, {'a': 4}, {'a': 2, 'b': 3}]
session.bulk_insert_mappings(MY_OBJECT, my_objects)

关于python - sqlalchemy bulk_insert_mappings 生成大量插入批处理,这是可以避免的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874745/

相关文章:

python - 带破折号的 Django/Python url 正则表达式

python - 每当我更改列表大小时,列表索引超出范围

mysql - 如何加快这个缓慢的查询

python - spacy 相似性方法不能正常工作

MySQL自反/递归关系

mysql - 如何为不同的类使用 Relation::morphMap()

database - 移动应用程序的后台数据同步

mysql - 如何减少sql查询的加载时间?

algorithm - 插入时排序数组还是使用堆更快

python - 如何使用 anaconda 为 python 安装 google.cloud automl_v1beta1?