我正在编写Django-ORM附约,尝试对模型进行缓存并将模型保存推迟到事务结束。 一切都快完成了,但是我遇到了SQL语法中的意外困难。
我不是DBA的专家,但据我了解,对于许多小型查询,数据库并不能真正有效地工作。 很少有更大的查询会更好。 例如,最好使用大批量插入(例如一次100行)而不是100个单线。
现在,据我所知,SQL并没有提供任何语句来对表执行批处理更新。 这个术语似乎令人困惑,因此,我将解释我的意思。 我有一个任意数据数组,每个条目描述一个表中的一行。 我想更新表中的某些行,每行都使用数组中相应条目中的数据。 这个想法与批处理插入非常相似。
例如:我的表可以有两列"id"和"some_col"。现在描述批量更新数据的数组由三个条目(1, 'first updated')、(2, 'second updated')和(3, 'third updated')组成。在更新之前,该表包含以下行:(1, 'first')、(2, 'second')、(3, 'third')。
我碰到了这篇文章:
为什么批量插入/更新速度更快? 批量更新如何工作?
这似乎可以满足我的要求,但是我无法真正弄清楚语法的结尾。
我也可以删除所有需要更新的行,然后使用批处理插入将它们重新插入,但是我很难相信这样做实际上会更好。
我使用PostgreSQL 8.4,因此这里也可以使用一些存储过程。 但是,当我计划最终开源该项目时,最欢迎在其他RDBMS上使用任何可移植的想法或方法来做同一件事。
后续问题:如何执行批处理“插入或更新” /“更新”语句?
检测结果
我执行了100次乘以10次插入操作,这些操作分布在4个不同的表上(因此总共进行1000次插入)。 我在带有PostgreSQL 8.4后端的Django 1.3上进行了测试。
结果如下:
通过Django ORM完成的所有操作-每经过约2.45秒,
相同的操作,但没有Django ORM进行-每次传递〜1.48秒,
仅插入操作,而无需查询数据库约0.72秒的序列值,
仅插入操作,以10个块(总共100个块)〜0.19秒执行,
仅执行插入操作,一个大的执行块约为0.13秒。
仅插入操作,每个块约250条语句,约0.12秒。
结论:在单个connection.execute()中执行尽可能多的操作。 Django本身引入了大量的开销。