복붙노트

[SQL] 업데이트 문에서 중복 데이터

SQL

업데이트 문에서 중복 데이터

최대 절전 모드에 관계없이 내가 그 열, 예를 들어, 값을 변경하고있어 여부의 모든 열을 포함 UPDATE 문을 생성합니다 :

tx.begin();
Item i = em.find(Item.class, 12345);
i.setA("a-value");
tx.commit();

이 UPDATE 문을 발행합니다

update Item set A = $1, B = $2, C = $3, D = $4 where id = $5

내가 그들을 변경하지 않은 상태 열 B 그래서, C, D가 업데이트됩니다.

말, 항목은 자주 업데이트되고 모든 열이 인덱싱됩니다. 이 같은 뭔가를 최대 절전 모드 부분을 최적화 할 수있는 의미가 있습니까?

tx.begin();
em.createQuery("update Item i set i.a = :a where i.id = :id")
    .setParameter("a", "a-value")
    .setParameter("id", 12345)
    .executeUpdate();
tx.commit();

무슨 대부분의 나를 혼란은이 '최적화되지 않은'과 '최적화'쿼리 버전의 계획을 설명 동일하다는 것입니다!

해결법

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

    1.PostgreSQL의 MVCC으로 인해 업데이트가 효과적으로 많이 DELETE 플러스 INSERT 등이다. 구운 값의 주목할만한 예외로 - 참조 :

    PostgreSQL의 MVCC으로 인해 업데이트가 효과적으로 많이 DELETE 플러스 INSERT 등이다. 구운 값의 주목할만한 예외로 - 참조 :

    (그리고 힙에 대한 사소한 차이는 튜플 - DELETE + INSERT 새로운 HOT 체인을 시작합니다 -하지만 그 손의 경우는 아무런 관계가 없습니다.)

    정확하게하려면 "삭제"행은 삭제가 최선을 다하고, 이후 진공 청소기로 청소 한 후 시작하는 모든 거래에 바로 보이지 않습니다. 따라서,베이스 측에 인덱스 조작 등 두 문 사이에 차이가 사실상 없다. (예외가, 킵 읽기를 적용합니다.) 그것은 네트워크 트래픽 비트 (데이터에 따라) 증가 및 구문 분석의 비트를 필요로한다.

    나는 HOT가 @ araqnid의 입력 후 좀 더 업데이트 공부하고 몇 가지 테스트를 실행. 실제로 값을 변경하지 않는 컬럼에 업데이트까지 HOT 업데이트에 관한 한 아무런 차이가 없습니다. 내 대답은 보유하고 있습니다. 자세한 내용은 아래를 참조하십시오.

    값이 실제로 변경하지 않는 사람들도 접촉되지 않기 때문에 이것은 또한, 구운 속성에 적용됩니다.

    그러나 (페이지 9.0 도입) 열 단위 트리거를 사용하는 경우, 이는 바람직하지 않은 부작용이있을 수 있습니다!

    나는 트리거에 대한 설명서를 인용 :

    굵게 강조 광산.

    추상화 레이어 편의를위한 것입니다. 그들은 SQL-문맹 개발자 또는 응용 프로그램이 서로 다른 RDBMS 간 이식을해야하는 경우 유용합니다. 단점에, 그들은 성능을 정육점과 실패의 추가 포인트를 소개 할 수 있습니다. 가능하면 내가 그들을 피하십시오.

    힙 전용 튜플은 8.3.4과 8.4.9에서 중요한 개선, 포스트 그레스 8.3과 함께 소개되었다. 포스트 그레스 8.3에 대한 릴리스 노트 :

    강조 광산. 그리고 "변경"은 이미 누르고있는 열이 같은 값으로 업데이트하는 경우 포함되지 않습니다. 나는 확실하지 않았다 나는 실제로 시험했다.

    궁극적으로, 소스 코드에서 광범위한 README.HOT 그것을 확인합니다.

    구운 열은 HOT 업데이트의 방해하지 않습니다. 열간 업데이트 튜플은 관계의 축배 포크 같은 불변 튜플 (들)에 연결한다. HOT는 대상 목록 (실제로 변경 여부)에 구운 값도 작업을 업데이트합니다. 구운 값이 변경되면, 그것은 분명, 토스트 관계 포크에 쓰기를 수반한다. 나도 그 모두를 테스트했다.

    내 말을하지 마십시오, 직접 참조하십시오. 포스트 그레스 체크 통계 기능의 몇 가지를 제공합니다. 와 모든 열없이 UPDATE를 실행하고 어떤 차이가 있는지 확인하세요.

    -- Number of rows HOT-updated in table:
    SELECT pg_stat_get_tuples_hot_updated('table_name'::regclass::oid)
    
    -- Number of rows HOT-updated in table, in the current transaction:
    SELECT pg_stat_get_xact_tuples_hot_updated('table_name'::regclass::oid)
    

    또는 pgAdmin를 사용합니다. 테이블을 선택하고 메인 창에서 "통계"탭을 검사합니다.

    주요 관계 포크의 같은 페이지에 새로운 튜플 버전의 여지가있을 때 HOT 업데이트 만 가능하다는 점에 유의하십시오. 해당 조건을 강제하는 한 가지 간단한 방법은 단지 몇 행을 보유하고 작은 테이블에 테스트하는 것입니다. 페이지 크기는 일반적으로 8K, 그래서 페이지의 여유 공간이 있어야합니다.

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

    2.당신은 최대 절전 모드 주석 @Entity을 사용할 수 있습니다 :

    당신은 최대 절전 모드 주석 @Entity을 사용할 수 있습니다 :

    @org.hibernate.annotations.Entity(dynamicUpdate = true)
    public class Item
    

    이것은 단지 변경된 필드를 업데이트합니다.

  3. from https://stackoverflow.com/questions/7806058/redundant-data-in-update-statements by cc-by-sa and MIT license