我正在写一个Django ORM增强,试图缓存模型,并将模型保存推迟到事务结束.一切都快完成了,但我在SQL语法方面遇到了意想不到的困难.
我不太擅长DBA,但据我所知,对于许多小查询,数据库并不能真正有效地工作.很少有更大的问题比这更好.例如,最好使用大批量插入(比如一次插入100行)而不是100行一行.
现在,在我看来,SQL并没有提供任何语句来对表执行批处理更新.这个词似乎是confusing,所以,我会解释我的意思.我有一个任意数据数组,每个条目描述表中的一行.我想更新表中的某些行,每个行都使用数组中相应条目中的数据.这个 idea 非常类似于批量插入.
例如:我的表可以有两列"id"
和"some_col"
.现在,描述批量更新数据的数组由三个条目(1, 'first updated')
、(2, 'second updated')
和(3, 'third updated')
组成.更新之前,表中包含行:(1, 'first')
、(2, 'second')
、(3, 'third')
.
我是通过这个帖子来的:
Why are batch inserts/updates faster? How do batch updates work?
这似乎是我想要的,但我无法真正理解最后的语法.
我还可以删除所有需要更新的行,并使用批插入重新插入它们,但我发现很难相信这实际上会表现得更好.
我使用PostgreSQL 8.4,所以这里也可以使用一些存储过程.然而,随着我计划最终开放该项目的源代码,任何在不同的RDBMS上做同样事情的可移植 idea 或方法都是最受欢迎的.
Follow up question:如何批量执行"插入或更新"/"插入"语句?
Test results
我在4个不同的表上执行了100次10次插入操作(总共1000次插入).我在Django 1.3上测试了PostgreSQL 8.4后端.
结果如下:
- 通过Django ORM完成的所有操作-每个通过~2.45 seconds次,
- 同样的操作,但没有Django ORM——每次通过~1.48 seconds次,
- 仅插入操作,不查询数据库中的序列值~0.72 seconds,
- 仅插入操作,以10块(总共~0.19 seconds块)的形式执行~0.19 seconds,
- 只有插入操作,一个大的执行块~0.13 seconds.
- 仅插入操作,每个块大约250条语句,~0.12 seconds条.
结论:在一个连接中执行尽可能多的操作.执行().Django本身带来了巨大的开销.
免责声明:除了默认主键索引,我没有引入任何索引,因此插入操作可能会因此运行得更快.