为什么批量插入/更新更快?批量更新如何工作?

let*_*nje 39 sql rdbms

为什么批量插入更快?是因为插入单行的连接和设置开销对于一组行是相同的吗?还有哪些因素会使批量插入更快?

批量更新如何工作?假设表没有唯一性约束,则insert语句对批处理中的其他insert语句实际上没有任何影响.但是,在批量更新期间,更新可能会更改表的状态,因此可能会影响批处理中其他更新查询的结果.

我知道批量插入查询的语法是在一个大查询中包含所有插入值.批量更新查询如何?例如,如果我有单一的表单更新查询:

update <table> set <column>=<expression> where <condition1>
update <table> set <column>=<expression> where <condition2>
update <table> set <column>=<expression> where <condition3>
update <table> set <column>=<expression> where <condition4>
Run Code Online (Sandbox Code Playgroud)

它们在批处理中使用时会发生什么.单个查询会是什么样的?

批量插入和更新是SQL标准的一部分吗?

Qua*_*noi 28

为什么批量插入更快?

由于种种原因,但主要的三个是这些:

  • 查询不需要重新解析.
  • 这些值在一次往返服务器中传输
  • 命令在单个事务中

是因为插入单行的连接和设置开销对于一组行是相同的吗?

部分是,见上文.

批量更新如何工作?

这取决于RDBMS.

Oracle可以传送所有的值作为收集和使用这个集合作为一个表JOIN.

PostgreSQL和中MySQL,您可以使用以下语法:

INSERT
INTO    mytable
VALUES 
        (value1),
        (value2),
        …
Run Code Online (Sandbox Code Playgroud)

您也可以准备一次查询并在某种循环中调用它.通常有一些方法可以在客户端库中执行此操作.

假设表没有唯一性约束,则insert语句对批处理中的其他insert语句实际上没有任何影响.但是,在批量更新期间,更新可能会更改表的状态,因此可能会影响批处理中其他更新查询的结果.

是的,您可能会或可能不会从这种行为中受益.

我知道批量插入查询的语法是在一个大查询中包含所有插入值.批量更新查询如何?

Oracle,您在联接中使用集合:

MERGE
INTO    mytable
USING   TABLE(:mycol)
ON      …
WHEN MATCHED THEN
UPDATE
SET     …
Run Code Online (Sandbox Code Playgroud)

PostgreSQL:

UPDATE  mytable
SET     s.s_start = 1
FROM    (
        VALUES
        (value1),
        (value2),
        …
        ) q
WHERE   …
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下如何使用最后指定的声明吗?我不是很了解它,但可能是我一直在寻找的东西. (3认同)

Qer*_*err 27

我正在寻找关于"批量/批量"更新的相同主题的答案.人们经常通过将插入子句与多个值集("批量"部分)进行比较来描述问题.

INSERT INTO mytable (mykey, mytext, myint)
VALUES 
  (1, 'text1', 11),
  (2, 'text2', 22),
  ...
Run Code Online (Sandbox Code Playgroud)

明确的答案仍然避开我,但我在这里找到了解决方案:http://www.postgresql.org/docs/9.1/static/sql-values.html

说清楚:

UPDATE mytable
SET 
  mytext = myvalues.mytext,
  myint = myvalues.myint
FROM (
  VALUES
    (1, 'textA', 99),
    (2, 'textB', 88),
    ...
) AS myvalues (mykey, mytext, myint)
WHERE mytable.mykey = myvalues.mykey
Run Code Online (Sandbox Code Playgroud)

它具有与"批量"相同的属性,即包含大量数据和一个语句.


hag*_*llo 5

其他文章解释了为什么批量语句更快,以及如何使用文字值。

我认为知道如何使用占位符很重要。不使用占位符可能会导致巨大的命令字符串,引号/转义错误,从而导致易于进行SQL注入的应用程序。

在PostgreSQL> = 9.1中带有占位符的批量插入

要在表“ mytable”中插入任意数量的行,表“ mytable”由列“ col1”,“ col2”和“ col3”组成,所有操作合在一起(一条语句,一笔事务):

INSERT INTO mytable (col1, col2, col3)
 VALUES (unnest(?), unnest(?), unnest(?))
Run Code Online (Sandbox Code Playgroud)

您需要为该语句提供三个参数。第一个必须包含第一列的所有值,依此类推。因此,所有参数必须是长度相等的列表/向量/数组。

在PostgreSQL> = 9.1中使用占位符进行批量更新

假设您的表格称为“ mytable”。它由“键”和“值”列组成。

update mytable 
  set value = data_table.new_value
  from 
    (select unnest(?) as key, unnest(?) as new_value) as data_table
  where mytable.key = data_table.key
Run Code Online (Sandbox Code Playgroud)

我知道,这不容易理解。看起来像混淆的SQL。另一方面:它可以工作,可以缩放,可以在没有任何字符串连接的情况下工作,既安全又非常快。

您需要为该语句提供两个参数。第一个必须是包含列“ key”的所有值的列表/向量/数组。当然,第二个必须包含“值”列的所有值。

如果遇到大小限制,则可能需要研究COPY INTO ... FROM STDIN(PostgreSQL)。