加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL中批量/批量更新/提升

发布时间:2020-12-13 16:41:03 所属栏目:百科 来源:网络整理
导读:我正在编写一个Django-ORM功能,尝试缓存模型并推迟模型保存,直到事务结束。这几乎完成了,但是我遇到了SQL语法中的意外困难。 我不是一个DBA,但从我的理解,数据库不能真正有效地为许多小的查询。几个更大的查询好多了。例如,最好使用大批量插入(一次说1
我正在编写一个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秒,
>同样的操作,但没有Django ORM完成 – 每次通过?1.48秒,
>只能插入操作,而不查询数据库的序列值?0.72秒,
>只能插入10个块(总共100个块)?0.19秒的块,
>只插入操作,一个大执行块?0.13秒。
>仅插入操作,每个块约250个语句,?0.12秒。

结论:在单个connection.execute()中执行尽可能多的操作。 Django本身引入了大量的开销。

免责声明:除了默认主键索引之外,我没有引入任何索引,因此插入操作可能运行得更快。

我已经使用了三种批量交易策略:

>即时生成SQL语句,以分号连接,然后一次提交语句。我以这种方式完成了100个插入,这是非常有效的(对Postgres做的)。
>如果已配置,则JDBC具有内置的批处理功能。如果生成事务,则可以刷新JDBC语句,以便它们一次性进行交易。这种策略需要更少的数据库调用,因为这些语句全部在一个批处理中执行。
> Hibernate还支持沿前面示例的JDBC批处理,但在这种情况下,您可以针对Hibernate Session执行flush()方法,而不是底层JDBC连接。它完成与JDBC批处理相同的事情。

顺便说一下,Hibernate还支持收集提取中的批处理策略。如果您使用@BatchSize注释集合,则在获取关联时,Hibernate将使用IN而不是=,导致更少的SELECT语句来加载集合。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读