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