"
Apoiado por

SELECT com mais olhos que barriga

Embora seja evidente que, ao fazer selecções de dados de uma tabela da base de dados, devemos ter o cuidado de escolher apenas os campos que necessitamos, a verdade é que há muito boa gente que não se dá a esse trabalho e manda vir tudo.

Mediremos aqui a diferença real entre as duas abordagens.


A transacção SE38 tem um ecrã onde podemos fazer experiências correndo pequenos pedações de código ABAP. A miserável tradução em português chama-lhe “Dicas e sugestões para performance de ABAP Objects” e pode ser acedido a partir do menu SE38 -> Ambiente -> Exemplos -> Exemplos de performance.

Lá encontram duas janelitas que permitem correr dois programas lado a lado. Experimente-se correr os seguintes códigos:

Muitos registos

Neste primeiro exemplo todos os campos da tabela KNA1 são carregados para a tabela interna:


data: tab type standard table of kna1.
select * from kna1 into table tab.

Já no segundo exemplo, carrega-se apenas o campo KUNNR:


data: tab type standard table of kunnr.
select kunnr from kna1 into table tab.

E os resultados são:
– todos os campos: 1053 microsegundos
– só o KUNNR: 17 microsegundos

Ou seja, pedir todos os campos da tabela demorou 60 vezes mais do que pedir apenas o KUNNR.

Um único registo

Se no caso de selecções de vários registos ainda vai sendo comum ter-se o cuidado de fazer esta filtragem, já no caso da selecção de apenas um registo o mundo ABAP está atafulhado de SELECT SINGLE *. Veja-se então o que acontece na escolha de apenas um registo:

Neste exemplo carregam-se todos os campos do primeiro registo da KNA1:


DATA: dat TYPE kna1.
SELECT SINGLE * INTO dat FROM kna1 WHERE kunnr = '0000000001'.

Já aqui só se carrega o campo KUNNR do primeiro registo da KNA1:


DATA: dat TYPE kunnr.
SELECT SINGLE kunnr INTO dat FROM kna1 WHERE kunnr = '0000000001'.

E os resultados são:
– todos os campos: 390 microsegundos
– só o KUNNR: 209 microsegundos

Valente diferença, não? Ler apenas um campo é 2x mais rápido do que ler todos.

Vá, vamos lá a deixar de ser preguiçosos. Nada de mandar vir tudo para depois não usar. Toca a escolher só o que interessa.

O Abapinho saúda-vos.

2 comentários a “SELECT com mais olhos que barriga”

  1. Ricardo Carvalho Diz:

    Olá.

    E assim?

    SELECT kunnr UP TO 1 ROW INTO dat
    FROM kna1 WHERE kunnr = ‘0000000001’.
    ENDSELECT.

    Ouvi dizer que era mais rápido que o select single. É verdade?

  2. nununo Diz:

    Não. Isso é um mito. Experimenta ir aos “Tips&Tricks” da SE30 e corre os dois exemplos lado a lado.

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).