#Dica - Simplificando agrupamentos com GROUP BY ALL no Oracle Database 23/26.ai

 
Com o lançamento do Oracle Database 23ai (versão 23.9), foi introduzido o recurso GROUP BY ALL, que simplifica às consultas SQL com agregações.

Por que ainda listar todas as colunas?

Tradicionalmente, ao usar GROUP BY, era obrigatório listar todas as colunas não-agrupadas presentes no SELECT. Imagine queries longas com muitas colunas — além de trabalhoso, aumenta a chance algum erro de sintaxe, especialmente quando o SELECT evolui em versões subsequentes.

Como fica a partir da versão 23.9?

A nova sintaxe permite que o otimizador do Oracle substitua internamente ALL pelas colunas não-agrupadas, poupando trabalho manual. "Por trás dos panos" o otimizador transforma a cláusula para incluir automaticamente as colunas que deveriam ser agrupadas.

Principais vantagens

Benefício Descrição
Menos repetição Não é mais preciso digitar todas as colunas manualmente.
Código mais legível Consultas ficam mais limpas e fáceis de ler.
Manutenção facilitada Mudanças no SELECT não exigem revisitar o GROUP BY.
Comportamento previsível A transformação realizada pelo otimizador é clara e transparente. 

Exemplo com a forma tradicional

SQL>
SQL> col owner for a25
SELECT owner, object_type, status, COUNT(*)
FROM all_objects
where rownum < 200
GROUP BY owner, object_type, status;SQL>   2    3    4

OWNER                     OBJECT_TYPE             STATUS    COUNT(*)
------------------------- ----------------------- ------- ----------
SYS                       INDEX                   VALID          103
SYS                       TABLE                   VALID           78
SYS                       CLUSTER                 VALID            6
SYS                       SEQUENCE                VALID            3
SYS                       LOB                     VALID            7
SYS                       EDITION                 VALID            1
PUBLIC                    SYNONYM                 VALID            1

7 rows selected.

SQL>
  • A cláusula GROUP BY contém explicitamente todas as colunas não agregadas do SELECT (owner, object_type, status).
  • Para cada combinação única dessas colunas, o Oracle conta (COUNT(*)) quantos registros existem.

Exemplo com nova funcionalidade

SQL>
SQL> col owner for a25
SELECT owner, object_type, status, COUNT(*)
FROM all_objects
where rownum < 200
GROUP BY ALL;SQL>   2    3    4

OWNER                     OBJECT_TYPE             STATUS    COUNT(*)
------------------------- ----------------------- ------- ----------
SYS                       INDEX                   VALID          103
SYS                       TABLE                   VALID           78
SYS                       CLUSTER                 VALID            6
SYS                       SEQUENCE                VALID            3
SYS                       LOB                     VALID            7
SYS                       EDITION                 VALID            1
PUBLIC                    SYNONYM                 VALID            1

7 rows selected.

SQL>
  • O GROUP BY ALL diz ao otimizador: “agrupa por todas as colunas não agregadas do SELECT”.
  • Internamente, o Oracle reescreve a consulta para: GROUP BY owner, object_type, status. Sem você precisar digitar essa lista.

Comentários