Data

4 set, 2013

Desempenho das variáveis CLOB no Oracle

Publicidade

Olá, pessoal! Hoje, através de simulações, vamos analisar o desempenho de algumas formas de concatenar dados em uma variável do tipo CLOB.

Geralmente utilizamos esses tipos de variáveis para guardar grandes quantidades de caracteres. Um bom exemplo de uso para esse tipo de variável é gravar dados em um arquivo, onde é necessário concatenar todo o conteúdo em uma única variável antes de escrever a informação no arquivo.

Uma variável CLOB suporta até 4 GB de dados do tipo texto.

Abaixo vamos demonstrar 3 simulações de como podem ser efetuada a concatenação de 42 mil caracteres em uma variável CLOB.

1. Simulação concatenando os dados utiliando uma variável do tipo VARCHAR2 com uma variável do tipo CLOB

[sql]
DECLARE
dtInicio TIMESTAMP;
dtFim TIMESTAMP;
strTexto CLOB;
num PLS_INTEGER := 6000; — Numero de interações para o teste

BEGIN
–Concatenando um conteúdo do tipo VARCHAR2 com uma variável CLOB
dtInicio := systimestamp;
strTexto := NULL;

FOR i IN 1 .. num LOOP
      strTexto := strTexto || to_char(‘TESTE’) || ‘, ‘;
END LOOP;

dtFim := systimestamp;

dbms_output.put_line(‘<wbr />Concatenando um conteúdo do tipo VARCHAR2 com uma variável CLOB: ‘ ||to_char(dtFim – dtInicio));
END;

[/sql]

Tempo de execução: 00:00:00.655400000.

2. Simulação concatenando os dados utilizando duas variáveis do tipo CLOB

[sql]
DECLARE
dtInicio TIMESTAMP;
dtFim TIMESTAMP;
strTexto CLOB;
  num PLS_INTEGER := 6000; — Numero de interações para o teste

BEGIN
  –Concatenando conteúdos entre tipos CLOB
dtInicio := systimestamp;
strTexto := NULL;

FOR i IN 1 .. num LOOP
strTexto := strTexto || to_clob(‘TESTE’) || ‘, ‘;
END LOOP;

dtFim := systimestamp;
dbms_output.put_line(‘<wbr />Concatenando conteúdos entre tipos CLOB: ‘ ||to_char(dtFim – dtInicio));
END;
[/sql]

Tempo de execução: 00:00:00.607982000.

3. Simulação concatenando os dados utilizando o método DBMS_LOB.APPEND

[sql]
DECLARE
dtInicio TIMESTAMP;
  dtFim TIMESTAMP;
strTexto CLOB;
  num PLS_INTEGER := 6000; — Numero de interações para o teste

BEGIN
–Concatenando conteúdos utilizando o metodo DBMS_LOG.APPEND
dtInicio := systimestamp;
strTexto := NULL;
strTexto := ‘ ‘; –É necessário ser inicializada

FOR i IN 1 .. num LOOP
dbms_lob.append(strTexto, ‘TESTE’ || ‘, ‘);
END LOOP;

dtFim := systimestamp;
dbms_output.put_line(‘<wbr />Concatenando conteúdos utilizando o metodo DBMS_LOG.APPEND: ‘ ||to_char(dtFim – dtInicio));
END;
[/sql]

Tempo de execução: 00:00:00.083087000

Análise

Veja que a primeira simulação analisada, quando foi utilizada a concatenação entre variáveis do tipo VARCHAR2 e CLOB dos caracteres, levou 0.655400000 segundos.

A segundo simulação analisada, quando foi utilizada a concatenação diretamente entre variáveis do tipo CLOB dos caracteres, levou 0.607982000 segundos.

A terceira simulação analisada, quando foi utilizada a concatenação utilizando a API core DBMS_LOB.APPEND  para efetuar a concatenação dos caracteres, levou 0.083087000 segundos.

Conclusão

Existe uma grande diferença de performace entre a utilização da concatenação direta entre as variáveis e a utilização do método DBMS_LOB.  Veja que as simulações foram baseadas na concatenação de 6 mil caracteres. Quando utilizada a API obtivemos redução de apróximadamente 90% do tempo da execução do processo.

Agora imagine um código desenvolvido para gerar milhares de arquivos e efetuar a interface entre uma empresa e um banco, imagine a diferença de tempo quando construído o processo de maneira incorreta. Para quem ainda não tinha o conhecimento da diferença de desempenho entre a forma de fazer a concatenação entre as variáveis, passe a utilizar a API e perceba a diferença.

Referências

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm