在PostgreSQL中批量/批量更新/提升
我正在编写一个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’)。 我来过这个帖子: Why are batch inserts/updates faster? How do batch updates work? 这似乎做了我想要的,但是我不能真正弄清楚语法的结尾。 我也可以删除所有需要更新的行,并使用批量插入重新插入,但是我觉得很难相信这实际上会更好。 我使用PostgreSQL 8.4,所以一些存储过程也可能在这里。然而,随着我计划最终开源项目,任何更多便携式的想法或方式在不同的RDBMS上做同样的事情是最受欢迎的。 跟进问题:如何做一个批处理“insert-or-update”/“upsert”语句? 检测结果 我执行了100次10次插入操作,分布在4个不同的表中(总共有1000个插入)。我在Django 1.3上测试了PostgreSQL 8.4后端。 结果如下: >所有操作都通过Django ORM完成 – 每次通过?2.45秒, 结论:在单个connection.execute()中执行尽可能多的操作。 Django本身引入了大量的开销。 免责声明:除了默认主键索引之外,我没有引入任何索引,因此插入操作可能运行得更快。
我已经使用了三种批量交易策略:
>即时生成SQL语句,以分号连接,然后一次提交语句。我以这种方式完成了100个插入,这是非常有效的(对Postgres做的)。 顺便说一下,Hibernate还支持收集提取中的批处理策略。如果您使用@BatchSize注释集合,则在获取关联时,Hibernate将使用IN而不是=,导致更少的SELECT语句来加载集合。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |