DataARTIGO

Desempenho das variáveis CLOB no Oracle

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

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

é formado em Análise de Sistemas pela Uniban. Possui 10 anos de experiência em análise, implementação e desenvolvimento de softwares com Oracle Forms/Reports, PL/SQL. Também possui experiência de 6 anos em WebTool Kit, HTML, JavaScript, XML, CSS e APEX, além de conhecimentos em JAVA e Delphi. Possui certificação Oracle Advanced PL/SQL Developer Certified Professional 11g. Em sua experiência profissional teve a oportunidade de participar de diversos projetos, dos quais pode-se destacar migrações de sistemas de arquivos indexados em Cobol para banco de dados Oracle; tunning em camada de aplicações e camada de banco de dados; administração de banco de dados Oracle 9i e 10g; modelagem relacional de dados utilizando Erwin; migração do Forms 6i para Forms IAS 10g; levantamento, análise e desenvolvimento de software em Delphi com Oracle, Oracle WebTool Kit e APEX. Atualmente trabalha em uma empresa petroquimica, na qual atua como Desenvolvedor Oracle EBS, desenvolvendo customizações para todos os módulos, nos padrões e recursos do ERP, utilizando PL/Sql, Forms 6i, Reports 6i, Discover, WorkFlow e APEX.

Ver perfil