programing

Oracle에 여러 행 삽입

goodsources 2023. 7. 30. 17:44
반응형

Oracle에 여러 행 삽입

Oracle에 여러 행을 삽입하는 방법에 대한 논의에서 두 가지 접근 방식이 시연되었습니다.

첫 번째:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

두 번째:

INSERT ALL
   INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

누가 다른 것보다 하나를 사용하는 것을 선호한다고 주장할 수 있습니까?

추신: 제가 직접 조사를 한 것은 아니기 때문에(심지어 설명 계획까지) 어떤 정보나 의견이라도 감사하겠습니다.

감사해요.

성능 측면에서 보면 이러한 쿼리는 동일합니다.

UNION ALL성능에 영향을 미치지 않을 것입니다.Oracle추정치:UNION'ed 쿼리는 필요할 때만 쿼리하고 결과를 먼저 캐시하지 않습니다.

SELECT구문은 그런 점에서 더 유연해서 당신이 더 쉽게 조작할 수 있습니다.SELECT변경할 항목이 있는지 쿼리합니다.

예를 들어, 이 쿼리는 다음과 같습니다.

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

로 다시 쓸 수 있습니다.

INSERT
INTO    pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
SELECT  7999 + level, 0, 'Multi ' || 7999 + level, 1
FROM    dual
CONNECT BY
        level <= 2

대체함으로써2적절한 숫자를 사용하면 원하는 수의 행을 얻을 수 있습니다.

의 경우INSERT ALL대상 테이블 설명을 복제해야 합니다. 예를 들어, 다음과 같은 경우에는 읽기가 더 어렵습니다.40

INSERT ALL메서드에서 테이블에 더 많은 행을 삽입하는 데 문제가 있습니다.

최근에 SQL 문이 하나 있는 테이블에 1130개의 행을 삽입하려고 했습니다.제가 이걸 하려고 했을 때.INSERT ALLmethod 다음 오류가 발생했습니다.

ORA-24335 - 1000개 이상의 열을 지원할 수 없습니다.

사용한 경우INSERT INTO .. UNION ALL ..모든 것이 잘 되어 갔습니다.

Btw. 저는 이 토론을 발견하기 전까지 UNION ALL 방법에 대해 몰랐습니다 :)

저는 솔루션 1이 작동하는 약간의 해킹이며 Insert ALL의 설계된 대안보다 효율성이 낮을 것이라고 생각합니다.

모두 삽입은 선택한 결과로 여러 행을 하나 이상의 테이블에 삽입할 수 있도록 설계되었습니다. 예를 들어, 다음과 같습니다.

Insert ALL
into 
  t1 (c1, c2) values (q1, q2)
  t2 (x1, x2) values (q1, q3)
select q1, q2, q3 from t3 

수천 의 행을 로드하고 싶지만 아직 데이터베이스에 없는 경우에는 이 방법이 최선의 방법이라고 생각하지 않습니다. 데이터가 파일에 있는 경우에는 외부 테이블이나 SQL Loader를 통해 행을 효율적으로 삽입할 수 있습니다.

나는 약간의 테스트를 시도했고 더 빠른 해결책은

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

300개 <-> 400개 행 사이의 버퍼링(odbc로 시도했는데, 이 값은 구성에 따라 달라질 수 있음)

다음을 이용한 진술서UNION ALL삽입이 발생하기 전에 모든 문의 결과를 결합해야 하기 때문에 이론적으로 작은 성능 단점이 있습니다.INSERT ALL최종 결과는 이미 라인별로 처리될 수 있으므로 이러한 단점은 없습니다.

그러나 실질적으로 Oracle 내부의 최적화 도구는 이러한 차이를 무시할 수 있도록 해야 하며 어떤 방식을 선택할지는 사용자의 선호도에 달려 있습니다.

내 생각에 그것은.INSERT ALL이 더 잘 수 있는 은 두가지중더잘것은있읽는수을간이인에서▁the▁is-▁the?은▁human▁while것▁better?UNION ALL변형은 이러한 삽입이 자동으로 생성될 때 더 적은 공간을 차지하는 변형입니다.

1000보다 큰 insert 문이 있으면 모든 insert 문을 .sql 파일에 넣고 Toad 또는 SQL Developer에서 연 다음 실행합니다.모든 레코드가 삽입됩니다.

배열-삽입을 고려해야 합니다.

  • 간편한 SQL
  • 어레이 매개 변수를 설정하려면 클라이언트 측 코딩이 필요합니다.

이것은 수백 개의 삽입을 일괄적으로 수행해야 할 경우 네트워크 트래픽을 최소화하는 방법입니다.

언급URL : https://stackoverflow.com/questions/883706/inserting-multiple-rows-into-oracle

반응형