SQL em Oracle > DML > SELECT > Cláusula DISTINCT
Cláusula DISTINCT tl_logo2.jpg

Suponha que quer listar todos os departamentos da tabela EMP.

select deptno from emp;
    DEPTNO
----------
        20
        30
        30
        20
        30
        30
        10
        20
        10
        30
        20
        30
        20
        10

14 rows selected.

Para eliminar valores duplicados no resultado podemos usar DISTINCT

select distinct deptno from emp;
    DEPTNO
----------
        10
        20
        30

bthome.gifTopo


A cláusula DISTINCT aplica-se a cada linha como um todo. Para verificar isso comparem-se os resultados dos dois queries seguintes:

select deptno,job from emp;
    DEPTNO JOB
---------- ---------
        20 CLERK
        30 SALESMAN
        30 SALESMAN
        20 MANAGER
        30 SALESMAN
        30 MANAGER
        10 MANAGER
        20 ANALYST
        10 PRESIDENT
        30 SALESMAN
        20 CLERK
        30 CLERK
        20 ANALYST
        10 CLERK

14 rows selected.
select distinct deptno,job from emp;
    DEPTNO JOB
---------- ---------
        10 CLERK
        10 MANAGER
        10 PRESIDENT
        20 ANALYST
        20 CLERK
        20 MANAGER
        30 CLERK
        30 MANAGER
        30 SALESMAN

9 rows selected.

A utillização do DISTINCT obriga a base de dados a executar o query em três passos:

  1. Criar um "result set" com todas as linhas que satisfazem o query como se este não tivesse DISTINCT;
  2. Ordenar as linhas resultantes para identificar e eliminar valores repetidos;
  3. Mostrar o resultado ao utilizador;

Com DISTINCT o query fica mais pesado pois requer o passo 2. Sem ordenação o utilizador começaria a ver resultados logo que o primeiro conjunto de dados fosse identificado pela base de dados. Isso permite à base de dados continuar a trabalhar enquanto o utilizador está "entretido" com o primeiro conjunto de dados. Por esta razão os queries com DISTINCT devem ser optimizados para "all rows" e não para "first rows". Para saber mais sobre isto consulte no manual de Optimização o tema ORACLE OPTIMIZER.

Se a consulta devolver um volume de dados que não cabe na memória do processo que está em execução, a ordenação pode tornar-se uma operação pesada em termos de I/O, já que a base de dados é obrigada a utilizar armazenamento temporário em disco. Para saber mais sobre isto consulte no manual de Optimização: SORT_AREA_SIZE e SERVER PROCESS.

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-02-26