복붙노트

[SQL] 왜 빠른 일괄 삽입 / 업데이트는 무엇입니까? 어떻게 배치 업데이트 작업을?

SQL

왜 빠른 일괄 삽입 / 업데이트는 무엇입니까? 어떻게 배치 업데이트 작업을?

왜 일괄 삽입은 빠르다? 이는 하나의 행을 삽입하기위한 연결 및 설정 오버 행의 세트에 대해 동일하기 때문이다? 일괄 삽입 빨리 어떤 다른 요인 만들어?

어떻게 배치 업데이트 작업을? 테이블을 가정하면 문이 정말 배치의 다른 삽입 제표에 영향을주지 않는 삽입, 더 고유성 제약이 없습니다. 그러나 일괄 업데이트 동안, 업데이트가 배치 다른 업데이트 쿼리의 결과에 영향을 미칠 수 있습니다 따라서 테이블의 상태를 변경 할 수 있습니다.

쿼리는 하나 개의 큰 쿼리의 모든 삽입 값이 구문이 삽입 그 배치를 알고있다. 일괄 업데이트 쿼리는 어떻게처럼 보이나요? 의 경우 예를 들어, 난 형태의 단일 업데이트 쿼리가있는 경우 :

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>

그들은 배치에 사용하는 경우 어떤 일이 발생합니다. 무엇처럼 단일 쿼리 모양을 것인가?

일괄 삽입 및 업데이트는 SQL 표준의 일부인가?

해결법

  1. ==============================

    1.나는 "대량 / 배치"업데이트에 대한 동일한 주제에 대한 대답을 찾고 있었다. 사람들은 여러 값 세트에 삽입 절 (이하 "대량"부분)와 비교하여 문제를 설명합니다.

    나는 "대량 / 배치"업데이트에 대한 동일한 주제에 대한 대답을 찾고 있었다. 사람들은 여러 값 세트에 삽입 절 (이하 "대량"부분)와 비교하여 문제를 설명합니다.

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

    명확한 대답은 여전히 ​​날 피하는했지만, 내가 여기 해결책을 발견 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
    

    그것은 일명 "대량"되는 하나 개의 문장으로 많이 데이터에 포함 된 동일한 속성이 있습니다.

  2. ==============================

    2.많은 이유,하지만 주요 세이 있습니다 :

    많은 이유,하지만 주요 세이 있습니다 :

    부분적 예, 위의 내용 참조.

    이 RDBMS에 따라 달라집니다.

    오라클에서는 컬렉션으로 모든 값을 전송할 수 있으며 조인에서 테이블로이 컬렉션을 사용합니다.

    PostgreSQL의와 MySQL에서 다음과 같은 구문을 사용할 수 있습니다 :

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

    또한 한 번 쿼리를 준비하고 루프의 어떤 종류를 호출 할 수 있습니다. 일반적으로 클라이언트 라이브러리에서이 작업을 수행하는 방법이 있습니다.

    예, 당신은 또는이 동작에서 도움이되지 않을 수 있습니다.

    오라클에서는, 당신은에서 모음을 사용하여 조인

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

    PostgreSQL의에서 :

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

    3.대량 문을 빨리하고 리터럴 값으로 작업을 수행하는 방법을 왜 다른 게시물에 대해 설명합니다.

    대량 문을 빨리하고 리터럴 값으로 작업을 수행하는 방법을 왜 다른 게시물에 대해 설명합니다.

    나는 자리로 작업을 수행하는 방법을 아는 것이 중요하다고 생각합니다. 사용하지 않으면 자리가 버그를 탈출하여 SQL 주입하는 경향이 응용 프로그램에 / 인용에, 거대한 명령 문자열 발생할 수 있습니다.

    가지고 하나 (하나의 명령문, 하나의 트랜잭션)의 모든 열 "COL1,"COL2 "와"COL3 "로 구성된 테이블에"MYTABLE "행의 임의의 숫자를 삽입하려면 :

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

    이 문에 세 개의 인수를 제공해야합니다. 첫 번째는 첫 번째 열 등의 모든 값을 포함한다. 따라서, 모든 인수는 동일한 길이의리스트 / 벡터 / 배열해야한다.

    하자 말은, 당신의 표는 "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
    

    나는 알고있다, 이것은 이해하기 쉽지 않다. 그것은 난독 SQL처럼 보인다. 다른 측면에서 : 그것은, 그것이 어떤 문자열 연결없이 작동, 확장, 작동은 안전하고 엄청나게 빠릅니다.

    이 문에 두 개의 인수를 제공해야합니다. 첫 번째 열 "키"에 대한 모든 값을 포함하는 목록 / 벡터 / 배열되어야한다. 물론, 두 번째 열 "값"에 대한 모든 값을 포함한다.

    당신이 크기 제한을 칠 경우에, 당신은 STDIN (PostgreSQL을) FROM ... COPY INTO로 볼 수 있습니다.

  4. ==============================

    4.일괄 업데이트에서 데이터베이스가 행의 갱신에 의해 연속적으로, 데이터의 집합에 대해 작동은 행이 5 월 배와 같은 명령을 실행한다. 당신이 일괄 적으로 만 행을 삽입 그렇다면, 명령이 전송 한 번하고 행으로 행의 갱신, 그것은 전송 및 처리 만 번에 처리됩니다. 당신은 SQL Server 또는 상관 하위 쿼리에 커서를 사용하고 싶지는 않을 이유이기도하다.

    일괄 업데이트에서 데이터베이스가 행의 갱신에 의해 연속적으로, 데이터의 집합에 대해 작동은 행이 5 월 배와 같은 명령을 실행한다. 당신이 일괄 적으로 만 행을 삽입 그렇다면, 명령이 전송 한 번하고 행으로 행의 갱신, 그것은 전송 및 처리 만 번에 처리됩니다. 당신은 SQL Server 또는 상관 하위 쿼리에 커서를 사용하고 싶지는 않을 이유이기도하다.

    SQL 서버의 집합 기반 업데이트의 예 :

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

    이것은 한 번에 널 (null) 모두 100 만 개 레코드를 업데이트 할 것입니다. (가 아닌 배치 방식으로 만 개 행을 업데이트하는 방법입니다) 커서 업데이트는 각 행에 한 번을 반복하고 업데이트 할 것입니다.

    배치 삽입의 문제는 배치의 크기입니다. 한 번에 너무 많은 레코드를 업데이트하려고하면, 데이터베이스는 다른 모든 사용자를 잠금, 프로세스의 기간 동안 테이블을 잠글 수 있습니다. 한 번에 배치의 일부만을한다 (하지만 거의 한 번에 하나의 행보다 숫자보다 한 번에 빠르게 하나의 행보다 것)이 갱신 또는 삽입하거나 삭제하는보다 느린 루프를 수행해야 할 수 있도록 전체 배치하지만,보다 빠른 행 작업을 행함으로써 많은 사용자와 사용자가 같은 테이블에있는 다른 기록을보고 업데이트하려고하지 않는 작은 가능한 다운 타임 프로덕션 환경에서 필요할 수 있습니다. 배치의 크기는 데이터베이스 구조에 따라 크게 차이가 정확히 (트리거 및 제약 조건이 많은 테이블은 속도가 느린 등의 분야의 많은 테이블은 그래서 작은 배치를 필요로하는) ​​무슨 일이 일어나고 있는지.

  5. from https://stackoverflow.com/questions/1006969/why-are-batch-inserts-updates-faster-how-do-batch-updates-work by cc-by-sa and MIT license