programing

INSERT /*+APPEND*/가 사용되는 이유는 무엇입니까?

stoneblock 2023. 9. 1. 20:30

INSERT /*+APPEND*/가 사용되는 이유는 무엇입니까?

Java 프로그램이 Oracle 테이블에 대량 삽입을 수행하고 있습니다.100-200개의 레코드에 대해서는 잘 작동하지만 4000개 이상의 레코드에 대해서는 작동하지 않습니다.

제가 쿼리를 확인했을 때, 그것은INSERT /*+APPEND*/그 안에

란?INSERT /*+APPEND*/INSERT 쿼리에 사용되는 이유는 무엇입니까?이것 때문에 프로그램이 중단되는 건가요?

SQL Optimizer 힌트입니다.당신의 경우에는 거의 영향이 없습니다.어쩌면 너무 이른 최적화일 수도 있습니다.

이 힌트는 Oracle의 버퍼 캐시를 우회하여 데이터 파일에 직접 데이터를 쓰는 이른바 직접 경로 삽입을 시행해야 합니다.데이터가 HWM(높은 워터마크)을 넘어 추가됩니다. 테이블의 사용 가능한 공간 맵을 무시하고 트리거가 실행되지 않으며 제약 조건이 확인되지 않습니다.반면에 이런 유형의 삽입은 차단되고 있습니다.특정 테이블에서 동시에 하나의 세션만 사용할 수 있습니다.

문서에서 발췌한 내용:

"APDEND 힌트는 INSERT 문의 하위 쿼리 구문에서만 지원되며 VALUEs 절에서는 지원되지 않습니다.VALUEs 절과 함께 ADPEND 힌트를 지정하면 무시되고 일반적인 삽입이 사용됩니다.VALUEs 절과 함께 직접 경로 INSERT를 사용하려면 "APPEND_VALUEs Hint"를 참조하십시오. 이 힌트는 INSERT를 SELECT 문으로 사용할 때만 작동합니다.

 insert into <table> SELECT * FROM ....

값을 삽입하면 Oracle은 값을 자동으로 무시합니다.최신 Oracle 버전에서는 ADPEND_VALUE 힌트도 지원합니다.

Toad 또는 SQL Developer에서 사용 중인 힌트를 확인하려면 세션 브라우저를 선택하고 특정 세션과 현재 SQL 및 실행 계획을 찾습니다.▁in▁like볼때와 같은 것을 볼 때."INSERT into TABLE CONVENTIONAL"그러면 힌트가 무시됩니다. 보이면,"INSERT as SELECT"직접 경로 로드를 사용하는 것입니다.

insert일반적으로 테이블에서 새 레코드를 추가할 첫 번째 빈 공간을 찾습니다.이렇게 하면 공간이 절약되지만 작업 속도가 느려질 수 있습니다.

/*+APPEND*/그것은 원인이 되는 힌트입니다.insert항상, 음, 더 나은 용어가 부족하기 때문에, 새로 삽입된 행을 표의 끝에 추가합니다.이렇게 하면 공간을 낭비할 수 있지만 일반적으로 속도가 더 빠릅니다.테이블 중간에 빈 영역이 너무 많지 않다는 것을 알고 있는 경우 특히 유용합니다(즉, 많은 작업을 수행하지 않음).delete모래땅update자).

추가 */

  • 직접 경로 삽입이라고 합니다.
  • 데이터가 HWM(높은 워터마크)을 넘어 추가됩니다. 테이블의 사용 가능한 공간 맵을 무시하고 트리거가 실행되지 않으며 제약 조건이 확인되지 않습니다.
  • 특정 테이블에서 한 세션만 동시에 사용할 수 있습니다.

사용 중인 힌트를 확인하려면 해당 세션과 해당 세션의 현재 SQL 및 실행 계획을 찾습니다.실행 계획에서 "INSERT in TABLE CONVENTICATION"과 같은 항목이 표시되면 힌트는 무시됩니다."선택으로 삽입"이 표시되면 직접 경로 로드를 사용하는 것입니다.

  • INSERT 문의 하위 쿼리 구문에서만 지원되며, VALUEs 절에서는 지원되지 않습니다.
  • VALUEs 절과 함께 ADPEND 힌트를 지정하면 무시되고 일반적인 삽입이 사용됩니다.
  • VALUE 절과 함께 직접 경로 INSERT를 사용하려면 "APPEND_VALUE 힌트"를 참조하십시오. 이 힌트는 INSERT를 SELECT 문으로 사용할 때만 작동합니다.

Oracle 컴파일러 힌트입니다.그것은 목적을 위한 것이며 논평이 아닙니다.이 힌트는 삽입 속도를 높이기 위해 사용되기 때문에 프로그램을 중단하는 원인이 아니라고 생각합니다.

그러나 이 테이블이 사용 중인 테이블 영역에서 사용 가능한 여유 공간을 확인하도록 dba에게 요청하십시오.(당신의 dba는 이 진술을 더 잘 이해할 것입니다.

테이블 공간에 더 이상 삽입할 수 있는 공간이 매우 부족하여 DBA가 이를 해결할 수 있어야 하는 문제가 문제가 발생할 수 있습니다.

사용 가능한 공간이 더 적을 수 있는 이유는 무엇입니까?ADPEND 힌트는 위의 @Mureinik의 답변에서 설명한 대로 공간을 낭비하고, 해당 표에 이 힌트를 포함한 삽입이 너무 많으면 문제가 될 수 있습니다.

업"것에 대해서는 잘 . 에서 다른 을 할 때, 와 "speed up" 명령어를 때, 하는 데 합니다. 코멘트가 아니라 제가 한 테이블에서 다른 테이블로 삽입을 할 때, 명령과 쌍을 이룰 때, 레코드 순서를 유지하는 데 매우 유용합니다.ORDER BY 마에막지:

INSERT /*+ append */ INTO MYAPP.COUNTRIES (ID, CODE, NAME)
SELECT ID, CODE, NAME FROM MYAPP.OLD_COUNTRIES_TABLE ORDER BY NAME ASC;
COMMIT;

저는 이것이 단지 우연의 일치일 뿐이라는 느낌을 받았습니다(S.O.의 이 스레드 참조). 하지만 저는 그것을 여러 번 사용했고, 적어도 그것이 제가 마무리하고 있는 과일입니다.사용하는 경우INSERT와 함께ORDER BY하지만 추가 힌트가 없으면,ORDER BY무시되고 기록이 삽입된 순서에 따라 검색될 수 있도록 보장하는 데 전혀 도움이 되지 않습니다(제 답변의 증거 참조).

언급URL : https://stackoverflow.com/questions/23823048/why-insert-append-is-used