GUIDE_LINE

  1. SELECT .... ENDSELECT
    Quando usamos a cláusula <SELECT ...ENDSELECT> o
    retorno do servidor é feito registro a registro.

    SELECT *
    FROM table
    WHERE field1 = ‘xxxx.

    Treatment.

    ENDSELECT.
    • Exceto em casos de um único registro (SELECT UP TO 1 ROWS … ENDSELECT.).
    • SELECT INTO TABLE
    • O retorno do servidor é feito uma única vez para todos os registros.

    • SELECT *
    • INTO TABLE wt_table
    • FROM table
    • WHERE field1 = ‘xxxx’.

    • IF sy-dbcnt NE 0.
    • LOOP AT wt_table.

    Treatment.

    • ENDLOOP.
    • ENDIF.
  2. INTO CORRESPONDING FIELDS OF

    DATA : BEGIN OF wt_table OCCURS 0,
    field1 LIKE table-field1,
    field2 LIKE table-field2,
    field3 LIKE table-field3,
    END OF wt_table.

    SELECT *
    INTO CORRESPONDING FIELDS OF
    wt_table
    FROM table
    WHERE field1 = ‘xxxx’.
    • Neste caso o SAP executa uma pesquisa em busca dos campos de mesmo nome dos retornados no 'select' para depois alocá-los
    • INTO TABLE

    • DATA : BEGIN OF wt_table OCCURS 0,
    • field1 LIKE table-field1,
    • field2 LIKE table-field2,
    • field3 LIKE table-field3,
    • END OF wt_table.

    • SELECT field1 field2 field3
    • INTO TABLE wt_table
    • FROM table
    • WHERE field1 = ‘xxxx’.
  3. FOR ALL ENTRIES IN
    SELECT *
    INTO TABLE wt_table1
    FROM table1
    WHERE field1 IN s_field1.

    SELECT *
    INTO TABLE wt_table2
    FROM table2
    FOR ALL ENTRIES IN wt_table1
    WHERE field1 =
    wt_table1-field1
    AND field2 = ‘xxxx’.
    • - testar qde registros- Ordenar- Eliminar duplicados* Usar a chave primária ou campos que sejam seletivos através de algum índice
    • FOR ALL ENTRIES IN
    • SELECT *
    • INTO TABLE wt_table1
    • FROM table
    • WHERE field1 IN s_field1.

    • IF sy-dbcnt NE 0.
    • SORT
    • wt_table1 BY field1.
    • DELETE ADJACENT DUPLICATES FROM
    • wt_table1
    • COMPARING field1.

    • SELECT *
    • INTO TABLE wt_table2
    • FROM table2
    • FOR ALL ENTRIES IN
    • wt_table1
    • WHERE field1 =
    • wt_table1-field1
    • AND field2 = ‘xxxx’.

    ENDIF.
  4. READ TABLE
    READ TABLE wt_table
    WITH KEY field1 = wv_field1.
    • Utilizar READ TABLE WITH KEY com BINARY SEARCH
    • READ TABLE
    • SORT wt_table BY field1.
    • READ TABLE wt_table
    • WITH KEY field1 = wv_field1
    • BINARY SEARCH.
  5. LOOP AT
    LOOP AT wt_table1.
    LOOP AT wt_table2
    WHERE field =
    wt_table1-field.
    Treatment.
    ENDLOOP.
    ENDLOOP.
    • - Evitar ao extremo LOOP WHERE- Evitar o uso de mais de 3 loops aninhados - Utilizar LOOP FROM SY-TABIX sempre que possível
    • LOOP AT
    • SORT wt_table1 BY field1.
    • SORT wt_table2 BY field1.
    • wv_index = 1.
    • LOOP AT wt_table1.
    • LOOP AT wt_table2 FROM
    • wv_index.
    • IF wt_table2-field1 >
    • wt_table1-field1.
    • wv_index = sy-tabix.
    • EXIT.
    • ELSE IF wt_table2-field1 =
    • wt_table1-field1.
    • Treatment.
    • ENDIF.
    • ENDLOOP.
    • Treatment.
    • ENDLOOP.
  6. ORDER BY
    SELECT *
    FROM table
    WHERE field1 = ‘xxxx’
    ORDER BY field2.
    • Não usar ORDER BY para campos na cláusula fora dos índices
    • ORDER BY
    • SELECT *
    • INTO TABLE wt_table
    • FROM table
    • WHERE field1 = ‘xxxx’.
    • IF sy-dbcnt NE 0.
    • SORT
    • wt_table BY field2.
    • LOOP AT wt_table.
    • Treatment.
    • ENDLOOP.
    • ENDIF.
  7. SELECT *

    SELECT *
    INTO CORRESPONDING FIELDS OF TABLE
    wt_ekpo
    FROM wt_ekpo
    FOR ALL ENTRIES IN wt_ekko
    WHERE ebeln = wt_ekko-ebeln.
    • Apesar da comodidade, devemos evitar o uso de * pois o mesmo aloca muito espaço em memória. É recomendado selecionar somente os campos que serão utilizados.
    • SELECT ebeln matnr menge
    • INTO TABLE wt_ekpo
    • FROM wt_ekpo
    • FOR ALL ENTRIES IN wt_ekko
    • WHERE ebeln =
    • wt_ekko-ebeln.
  8. SELECT
    dentro de LOOP...ENDLOOP

    SELECT *
    INTO TABLE it_table1
    FROM table1.

    Loop at it_table1.

    SELECT *
    FROM table2
    INTO TABLE it_table2
    WHERE table1-field1 =
    table2-field1
    AND it_table2-field2 = 'abc'.

    Treatment.

    Endloop.

    SELECT *
    INTO TABLE it_table1
    FROM table1.

    SORT it_table1 BY field1.
    DELETE ADJACENT DUPLICATES FROM it_table1

    COMPARING field1.

    SELECT *
    INTO TABLE it_table2
    FROM table2
    FOR ALL ENTRIES IN it_table1
    WHERE field1 = it_table1-field1
    AND field2 = 'abc'.

    Loop at it_table1.

    READ TABLE it_table2
    WITH KEY field1 =
    it_table1-field1
    BINARY SEARCH.

    IF SY-SUBRC = 0.
    Treatment.
    ENDIF.

    Endloop.
    • SELECT *
    • INTO TABLE it_table1
    • FROM table1.

    • SORT it_table1 BY field1.
    • DELETE ADJACENT DUPLICATES FROM it_table1

    COMPARING field1.

    • SELECT *
    • INTO TABLE it_table2
    • FROM table2
    • FOR ALL ENTRIES IN it_table1
    • WHERE field1 = it_table1-field1
    • AND field2 = 'abc'.

    Loop at it_table1.

    • READ TABLE it_table2
    • WITH KEY field1 =
    • it_table1-field1
    • BINARY SEARCH.

    • IF SY-SUBRC = 0.
    • Treatment.
    • ENDIF.

    Endloop.
  9. Utilizar operações array/massiva para atualizar tabelas (p. ex. INSERT / DELETE /
    UPDATE / MODIFY FROM TABLE) ao invés
    de utilizar loops
    LOOP AT wt_table
    WHERE field1 = ‘xxx’.
    DELETE wt_table.
    ENDLOOP.

    LOOP AT wt_table
    WHERE field1 = ‘xxx’.
    wt_table-field2 = ‘aaa’.
    wt_table-field3 = ‘bbb’.
    MODIFY wt_table.
    ENDLOOP.

    LOOP AT wt_table1.
    MOVE wt_table1 TO wt_table2.
    APPEND wt_table2.
    ENDLOOP.

    LOOP AT wt_table1.
    MOVE-CORRESPONDING wt_table1 TO
    wt_table2.
    ENDLOOP.
    • DELETE FROM wt_table
    • WHERE field1 = ‘xxx’.



    • CLEAR wt_table.
    • wt_table-field2 = ‘aaa’.
    • wt_table-field3 = ‘bbb’.
    • MODIFY wt_table
    • TRANSPORTING field2 field3
    • WHERE field1 = ‘xxx’.

    • APPEND LINES OF wt_table1
    • TO wt_table2.



    wt_table2[] = wt_table1[].
  10. Boa Prática
    Evitar utilizar seleções com OR ou argumentos que possam agregar muito peso aoacesso ao DB, trocando por vários SELECTs na mesma tabela, usando INTO TABLEno 1º select, e APPENDING TABLE nos demais (se necessário, excluirduplicidades após todos os SELECTs). Ex.: Tabela VBFA com OR nos camposVBTYP_N ou VBTYP_V
  11. Boa Prática 11
    Não usar JOIN com mais de 5 tabelas ou JOIN muito complexos (criar views). Sepossível, desmembrar um join muito complexo em vários selects (ou joinsmenores), compondo a tabela interna com todos os dados ao final dos selects
  12. Boa Prática 12
    SELECTCOUNT: O * faz parte da sintaxe do comando. (Se for apenas para validar se oregistro existe, usar adicionalmente UP TO 1 ROWS)
  13. Boa Prática 13
    SELECT- Sempre buscar a utilização de um índice e seguir aseqüência de campos deste indice
  14. Boa Prática 14
    Todo SELECT SINGLE deve ser utilizado com a chave completa (caso contrárioutilizar SELECT..UP TO 1 ROWS...ENDSELECT.)
  15. Boa Prática 15
    Evitar ao máximo funções em instruções SQL- GROUP BY- HAVING- DISTINCT
  16. Boa Prática 16
    Outrasconsiderações- Não utilizar COMPUTE- Utilizar WHILE ao invés de DO ... ENDDO- Não utilizar FIELD-SYMBOL com TYPE ANY- Não utilizar parâmetros sem tipo definido- Não utilizar o SORT em tabelas internas sem especificar os campos- Sempre que possível definir parâmetros de seleção como obrigatórios(especialmente os que compõe chave primária ou índices)- Avaliar a possibilidade de executar o processo em paralelo (avaliando combasis a disponibilidade de recursos), tratando com parâmetros o n.º detasks.- Verificar a possibilidade de utilizar funções "SINGLE_READ" aoinvés de acessar diretamente o banco de dados- Verificar a possibilidade de utilizar funções “ARRAY_READ”- Sempre utilizar as transações de Verificação Ampliada (Transação SLIN) eCode Inspector (Transação SCI) para detectar erros e avisos no código.
  17. Boa Prática 17
    Objetosde Banco de Dados* Criar tabelas comoBUFERIZADAS quando possível (Tabelas até 1 Mb e que não sofram muitasatualizações , típico de tabelas de cadastros estáveis)* Sugerir a criaçãode índices quando não houver um índice específico para a seleção de umagrande quantidade de registros (atentando ao fato de que a cada novo índice,INSERT/UPDATE ficarão mais demorados)* Sempre utilizar o campo mandante na criação dos índices* O padrão denomenclatura para criação de índice é sempre iniciar pela letra “Z”.* Criar tabelas com acategoria de tamanho e tipo de dados (APPL0, 1 etc) dimensionadascorretamente
  18. Boa Prática 18
    Definir tabelas internas grandes como SORTED e muito grandes como HASHED
Author
Anonymous
ID
20770
Card Set
GUIDE_LINE
Description
Performance Guide Line
Updated