"
Supported by

(Português) SELECT com mais olhos que barriga

Sorry, this entry is only available in European Portuguese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

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 “(Português) 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


About Abapinho
Abapinho runs on WordPress
Articles (RSS) e Comments (RSS).