Prompt: revisar um FOR EACH lento (índice, NO-LOCK, BY)

Discussão em 'Prompts de IA para Progress e Datasul' iniciado por fdantas, Setembro 4, 2026.

  1. fdantas

    fdantas Administrator Moderador

    Quando usar

    O relatório que rodava em 2 minutos passou a rodar em 40. Quase sempre é índice não aproveitado, um BY que força ordenação em memória, ou um FOR EACH aninhado que virou produto cartesiano.

    O prompt

    Código:
    Você é especialista em performance de Progress ABL / OpenEdge.
    
    Vou colar um bloco FOR EACH e a definição dos índices das tabelas
    envolvidas. Analise e responda:
    
    1. ÍNDICE ESCOLHIDO — qual índice o Progress provavelmente vai usar em cada
       FOR EACH, e por quê. Se o WHERE não casar com nenhum índice pela
       esquerda, diga explicitamente que vai dar varredura de tabela inteira.
    
    2. BRACKETING — quais campos do WHERE entram no bracket do índice e quais
       sobram como filtro depois da leitura. É a diferença entre ler 300
       registros e ler 3 milhões.
    
    3. ORDENAÇÃO — se há BY, diga se ele é atendido pelo índice ou se vai
       forçar sort em memória ou em disco.
    
    4. ANINHAMENTO — havendo FOR EACH dentro de FOR EACH, estime a ordem de
       grandeza de leituras e diga se dá para inverter a ordem dos laços ou
       usar uma temp-table intermediária.
    
    5. LOCK — aponte todo FOR EACH sem NO-LOCK que apenas lê, e todo
       EXCLUSIVE-LOCK dentro de laço longo.
    
    6. REESCRITA — reescreva o bloco corrigindo o que encontrou, mantendo a
       mesma regra de negócio. Se precisar mudar o resultado para ganhar
       performance, avise em vez de mudar calado.
    
    7. ÍNDICE NOVO — se a solução real for criar um índice, escreva a definição
       e diga o custo: impacto em gravação e em espaço.
    
    Ambiente: [versão do OpenEdge] — base [Progress nativa / Oracle ou SQL Server
    via DataServer]
    Volume aproximado: [ex.: ped-venda 4 milhões de linhas, ped-item 30 milhões]
    
    Código:
    ---
    [COLE O FOR EACH AQUI]
    ---
    
    Índices:
    ---
    [COLE A SAÍDA DO DATA DICTIONARY OU O TRECHO DO .df DESSAS TABELAS]
    ---
    
    O que preencher

    O volume das tabelas é o campo que mais muda a resposta. Sem ele a IA fica no genérico; com ele ela consegue dizer se vale criar índice ou se o ganho não paga o custo de gravação.

    Para pegar os índices rápido: Data Dictionary, menu Index, opção Report — ou proutil base -C describe.

    O que esperar de volta

    O item 2 é o coração da coisa. O Progress usa o índice pela esquerda: se o índice é cod-estabel + dt-emissao e você filtra só por dt-emissao, aquele índice não serve para nada. É o erro mais comum e o mais difícil de enxergar só lendo o código.

    Não acredite — confira

    A IA acerta bastante nisso, mas quem decide é o compilador. Compile com XREF:

    Código:
    COMPILE seu-programa.p XREF seu-programa.xrf.
    
    e procure as linhas SEARCH no arquivo .xrf: elas dizem qual índice foi usado de verdade. Se aparecer WHOLE-INDEX, é varredura completa — a IA estava certa em reclamar.

Compartilhe esta Página