Inserindo várias linhas no Oracle

votos
12

Na discussão sobre múltiplos inserção de linha ao oráculo duas abordagens foram demonstrados:

Primeiro:

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

Segundo:

INSERT IGNORE  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;

Alguém poderia argumentar a preferência de usar um sobre o outro?

PS Eu não fiz nenhuma pesquisa me (mesmo plano de explicação), de modo que qualquer informação ou opinião seria apreciada.

Obrigado.

Publicado 19/05/2009 em 17:13
fonte usuário
Em outras línguas...                            


7 respostas

votos
7

Do ponto de vista do desempenho, essas consultas são idênticas.

UNION ALLnão vai prejudicar o desempenho, uma vez que Oracleas estimativas da UNION'consulta ed apenas quando ele precisa, ele não armazena em cache os resultados do primeiro.

SELECTsintaxe é mais flexível nesse sentido que você pode mais easuly manupulate a SELECTconsulta se você quiser mudar alguma coisa.

Por exemplo, esta consulta:

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

pode ser reescrita como

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

Ao substituir 2com número adequado, você pode obter qualquer número de linhas que deseja.

No caso de INSERT IGNORE ALL, você teria que duplicar a descrição da tabela de destino, que é menos legível se você precisar, por exemplo, 40linhas.

Respondeu 19/05/2009 em 17:55
fonte usuário

votos
4

O INSERT IGNORE ALLmétodo tem um problema com a inserção de maior número de linhas em uma tabela.

Recentemente, queria inserir 1130 linhas em uma tabela com única instrução SQL. Quando eu tentei fazer isso com INSERT IGNORE ALLmétodo que eu tenho o seguinte erro:

ORA-24335 - não pode suportar mais de 1000 colunas

Quando eu usei INSERT IGNORE INTO .. UNION ALL ..abordagem tudo correu bem.

Btw. Eu não sabia sobre o método UNION ALL antes que eu encontrei esta discussão :)

Respondeu 09/11/2011 em 10:30
fonte usuário

votos
3

Eu tentei alguns de teste e a solução mais rápida deve ser

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

buffer entre 300 <-> 400 linhas (i tentou com ODBC, este valor poderia depende sobre sua configuração)

Respondeu 06/09/2013 em 10:00
fonte usuário

votos
3

Eu suspeito solução 1 é um pouco de um truque que funciona e é provavelmente menos eficiente do que a alternativa projetada de inserir todos.

Insira todos é realmente concebido para você inserir muitas linhas em mais de 1 mesa, como resultado de um select, por exemplo:

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

Se você deseja carregar milhares de linhas e eles não estão no banco de dados já , eu não acho que esta é a melhor maneira de fazê-lo - Se os dados estiverem em um arquivo, você quer olhar para tabelas externas ou SQL Loader para eficientemente inserir as linhas para você.

Respondeu 19/05/2009 em 17:28
fonte usuário

votos
2

A declaração utilizando o UNION ALLtem, teoricamente, uma pequena desvantagem de desempenho, pois tem à união os resultados de todas as declarações antes da inserção pode acontecer. A INSERT IGNORE ALLnão tem esta desvantagem como o resultado final já pode ser processada linha-a-linha.

Mas praticamente o otimizador dentro do Oracle deve fazer a diferença insignificante e é até suas preferências qual o caminho que você escolher.

Na minha opinião o INSERT IGNORE ALLé o melhor legível dos dois enquanto a UNION ALLvariante é o único a tomar menos espaço quando essa inserção é gerado automaticamente.

Respondeu 19/05/2009 em 17:23
fonte usuário

votos
-1

Se você tem instruções de inserção que são mais de 1000, em seguida, colocar todas as instruções de inserção em um arquivo .sql e abrir essa em sapo ou SQL Developer e, em seguida, executar. Todos os registros vai ser inserido.

Respondeu 13/12/2016 em 21:27
fonte usuário

votos
-2

Você deve considerar a matriz-Insert.

  • SQL fácil
  • precisa de algum código do lado do cliente para configurar a matriz-Parâmetros

Esta é a maneira de minimizar a Rede-Traffic se algumas centenas de inserções precisa ser feito em um lote.

Respondeu 01/10/2014 em 17:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more