| Cláusula DISTINCT | ![]() |
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
|
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:
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.
Realizado por Turtle Learning ®. Última alteração em 2011-02-26