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 ?