我正在编写一个 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 上做同样的事情是最受欢迎的。
后续问题: 如何执行批处理“ insert-or-update”/“ upsert”语句?
测试结果
我已经在4个不同的表上执行了100次10次插入操作(总共1000次插入)。我在 Django 1.3上测试了 PostgreSQL 8.4后端。
以下是结果:
结论: 在一个 Connection.execute ()中执行尽可能多的操作,Django 本身引入了大量的开销。
免责声明: 除了默认的主键索引之外,我没有引入任何索引,因此插入操作可能会因此运行得更快。