36

Вопрос по sql – Почему пакетные вставки / обновления быстрее? Как работают пакетные обновления?

Error: User Rate Limit Exceeded

Как работают пакетные обновления? Предполагая, что таблица не имеет ограничений уникальности, операторы вставки действительно не влияют на другие операторы вставки в пакете. Однако во время пакетных обновлений обновление может изменить состояние таблицы и, следовательно, может повлиять на результат других запросов на обновление в пакете.

Я знаю, что запросы на пакетную вставку имеют синтаксис, в котором у вас есть все значения вставки в одном большом запросе. Как выглядят запросы на пакетное обновление? Например, если у меня есть отдельные запросы на обновление формы:

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>

Что происходит, когда они используются в партии. Как будет выглядеть отдельный запрос?

Error: User Rate Limit Exceeded

  • Error: User Rate Limit Exceededstackoverflow.com/questions/55052395/…

    от
  • Error: User Rate Limit ExceededStatement.addBatch()Error: User Rate Limit ExceededStatement.executeBatch()Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededdocs.oracle.com/cd/B28359_01/server.111/b28318/…

    от
  • Error: User Rate Limit Exceeded

    от
  • 0

    Error: User Rate Limit Exceeded

    update mytable
    set myfield = 'test'
    where myfield is null
    

  • 27

    Why are batch inserts faster?

    Error: User Rate Limit Exceeded

    The query doesn't need to be reparsed. The values are transmitted in one round-trip to the server The commands are inside a single transaction

    Is it because the connection and setup overhead for inserting a single row is the same for a set of rows?

    Error: User Rate Limit Exceeded

    How do batch updates work?

    Error: User Rate Limit ExceededRDBMS.

    Error: User Rate Limit ExceededOracleError: User Rate Limit ExceededJOIN.

    Error: User Rate Limit ExceededPostgreSQLError: User Rate Limit ExceededMySQLError: User Rate Limit Exceeded

    INSERT
    INTO    mytable
    VALUES 
            (value1),
            (value2),
            …
    

    Error: User Rate Limit Exceeded

    Assuming the table has no uniqueness constraints, insert statements don't really have any effect on other insert statements in the batch. But, during batch updates, an update can alter the state of the table and hence can affect the outcome of other update queries in the batch.

    Error: User Rate Limit Exceeded

    I know that batch insert queries have a syntax where you have all the insert values in one big query. How do batch update queries look like?

    Error: User Rate Limit ExceededOracleError: User Rate Limit Exceeded

    MERGE
    INTO    mytable
    USING   TABLE(:mycol)
    ON      …
    WHEN MATCHED THEN
    UPDATE
    SET     …
    

    Error: User Rate Limit ExceededPostgreSQL:

    UPDATE  mytable
    SET     s.s_start = 1
    FROM    (
            VALUES
            (value1),
            (value2),
            …
            ) q
    WHERE   …
    

  • 24

    Error: User Rate Limit Exceeded

    INSERT INTO mytable (mykey, mytext, myint)
    VALUES 
      (1, 'text1', 11),
      (2, 'text2', 22),
      ...
    

    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
    

  • 4

    Error: User Rate Limit Exceeded

    Bulk insert with placeholders in PostgreSQL >= 9.1

    INSERT INTO mytable (col1, col2, col3)
     VALUES (unnest(?), unnest(?), unnest(?))
    

    Bulk update with placeholders in PostgreSQL >= 9.1

    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
    

    COPY INTO ... FROM STDIN