fev 152015
 

Já rodou aquele count distinct que demorou um tempão ?

O uso da função count (distinct expr) não é só útil em alguns relatórios, como é muito importante para definir a cardinalidade de uma tabela e melhorar a performance de uma consulta.

Mas existem counts que podem levar muito tempo para rodarem, além de dependendo do caso, até trazerem algum tipo de impacto no ambiente.

Existe alguma alternativa ?

Para ajudar em casos onde você não precisa de números exatos, o Oracle 12c disponibilizou uma nova função de agregação chamada APPROX_COUNT_DISTINCT.

O objetivo dela é o mesmo da função count (distinct expr), com exceção que ela não traz uma contagem exata, mas sim um valor aproximado. Estima-se que ela tenha 95% de precisão.

Ela é mais rápida ? É fácil de usar ?

Criei uma tabela simples, com 3GB e pouco mais de 35 milhões de registros.
Uma das colunas tem quase todos os seus valores distintos.

Vamos usá-la como testes:


SQL> select count(distinct COLUMN_1) count_column_1 from bigdata;

COUNT_COLUMN_1
--------------
      35038000

Elapsed: 00:00:18.51
SQL> select APPROX_COUNT_DISTINCT(COLUMN_1) count_approx_column_1 
from bigdata;

COUNT_APPROX_COLUMN_1
---------------------
	     34078638

Elapsed: 00:00:07.41

O APPROX_COUNT_DISTINCT foi muito mais rápido.

Mas o que dizer quando a quantidade de valores distintos é menor ?

Vejamos:

    
SQL> select count(distinct COLUMN_2) count_column_2 from bigdata;

COUNT_COLUMN_2
--------------
	     3

Elapsed: 00:00:07.85

SQL> select APPROX_COUNT_DISTINCT(COLUMN_2) count_column_2 from bigdata;

COUNT_COLUMN_2
--------------
	     3

Elapsed: 00:00:07.08

É verdade que agora os ganhos foram menores, bem menores, mas ainda assim o APPROX_COUNT_DISTINCT foi mais rápido.

Se você não precisa de valores exatos, o uso dessa nova função vai lhe salvar tempo.

O que você tem a dizer ? Tem feito bom uso dessa nova função ?

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)