성능 관련 질문이 있습니다. 이름이 Michael 인 사용자가 있다고 가정하겠습니다. 다음 쿼리를 수행하십시오.
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
쿼리가 동일한 값으로 업데이트 되더라도 실제로 업데이트를 실행합니까? 그렇다면 어떻게됩니까?
성능 관련 질문이 있습니다. 이름이 Michael 인 사용자가 있다고 가정하겠습니다. 다음 쿼리를 수행하십시오.
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
쿼리가 동일한 값으로 업데이트 되더라도 실제로 업데이트를 실행합니까? 그렇다면 어떻게됩니까?
답변:
Postgres 의 MVCC 모델 로 인해 SQL 규칙 에 따라 절 에서 제외되지 않은 모든 행에 UPDATE
대해 새 행 버전을 작성합니다 .WHERE
이 수행 직간접 적 성능에 어느 정도 상당한 영향을 미친다. "빈 업데이트"는 다른 업데이트와 동일한 행당 비용을 갖습니다. 다른 업데이트와 마찬가지로 트리거 (있는 경우)를 발생 시키며 WAL 로그 를 작성해야하며 테이블을 부 풀리는 데드 행을 생성하여 VACUUM
다른 업데이트와 마찬가지로 나중에 더 많은 작업을 수행합니다 .
관련된 열이 변경되지 않은 항목 및 TOASTed 열 은 동일하게 유지 될 수 있지만 업데이트 된 모든 행에 해당됩니다. 관련 :
빈 업데이트는 제외하는 것이 좋습니다 (실제로 발생할 가능성이있는 경우). 질문에 테이블 정의를 제공하지 않았습니다 (항상 좋은 생각입니다). 우리는 first_name
NULL 일 수 있다고 가정 해야합니다 ( "이름"에 놀라지 않을 것입니다). 따라서 쿼리는 NULL 안전 비교 를 사용해야 합니다 .
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
경우 first_name IS NULL
업데이트 이전에 테스트는 first_name <> 'Michael'
NULL로 평가 것이며, 이러한 업데이트에서 행을 제외한다. 부적절한 오류. 열이 정의되어 있으면 간단한 동등성 검사를 사용하십시오. 약간 저렴하기 때문입니다.NOT NULL
관련 :
Indexes entries and TOASTed columns where none of the involved columns are changed can stay the same
그러나 새로운 행 위치를 가리 키도록 업데이트하지 않아도됩니까?
rollback
스냅 샷 처리, 잠금 관리, WAL을 위한 특수 케이스
당신은 단순히 where
절에 추가 할 수 있습니다 :
UPDATE users
SET first_name = 'Michael'
WHERE users.id = 123
AND (first_name <> 'Michael' OR first_name IS NULL);
경우 first_name
로 정의 NOT NULL
의 OR first_name IS NULL
일부를 제거 할 수있다.
조건:
(first_name <> 'Michael' OR first_name IS NULL)
(Erwin의 답변에서) 더 우아하게 쓸 수 있습니다.
first_name IS DISTINCT FROM 'Michael'
NULL
@erwin
데이터베이스 관점에서
귀하의 질문에 대한 답변은 예입니다. 업데이트가 진행됩니다. 데이터베이스는 이전 값을 확인하지 않고 새 값만 설정합니다.
메모리에서 발생하고 (커밋이 발행 된 후에 만 데이터 파일에 기록됨) 성능에는 문제가되지 않습니다.
ORM 관점에서
일반적으로 데이터베이스의 단일 행을 나타내는 Object가 있습니다 (이보다 훨씬 복잡 할 수 있지만 단순하게 유지합시다). 이 객체는 메모리에서 (앱 서버 수준에서) 관리되며 해당 객체의 최신 커밋 된 버전 만 실제로 특정 시점에 데이터베이스로 만듭니다.
그것은 다른 행동을 설명 할 수 있습니다.
이제 화물선을 3D 프린터와 비교하지 마십시오. 화물선을 사용하여 3D 프린터를 보낼 수 있다고해서 서로 비교할 수있는 것은 아닙니다.
즐겨!
이것이 몇 가지 개념을 명확히하기를 바랍니다.