É possível consultar a reltuples
coluna de uma determinada tabela com condições adicionais como table.name LIKE 'hello%'
?
Atualmente em minhas tabelas maiores a SELECT count(*)
consulta demora muito e não precisaria de uma contagem exata. Então, eu queria saber se é possível adicionar WHERE
cláusulas ao reltuples
também?
Não fora da caixa. Mas você pode conseguir isso com um...
índice parcial
A coluna de índice real (
tbl_id
no exemplo) é irrelevante (a menos que você tenha uso adicional para o índice). Melhor escolher uma pequena coluna que nunca é alterada: umaserial
coluna PK seria uma candidata perfeita. Ou você pode usar uma constante (que anula propósitos adicionais desse índice):Cada índice tem sua própria entrada
pg_class
e sua própriareltuples
contagem. A documentação:Portanto, um índice parcial pode ser (ab-)usado para obter estimativas de contagem para qualquer conjunto de predicados, atualizados
autovacuum
automaticamente. Ou talvez você já tenha o índice porque precisa dele mesmo assim?Isso pode realmente ser uma ideia muito inteligente. Mas é preciso pesar custos e benefícios: o índice parcial é pequeno para uma condição rara , mas o custo aumenta para uma condição comum . E embora manter as estatísticas atualizadas seja comparativamente barato, não é gratuito.
Relacionado:
TABLESAMPLE SYSTEM (n)
no Postgres 9.5+Você vai adorar o novo recurso do próximo Postgres 9.5, que analisa apenas uma amostra aleatória de n % de blocos na tabela para obter uma estimativa rápida. Exemplo para 1 %:
Detalhes na resposta já vinculada acima:
Alternativa para o exemplo dado
Para o exemplo dado , você pode obter resultados exatos
name LIKE 'hello%'
muito rápidos usando o índice correto de qualquer maneira:Ver:
Você já deu excelentes conselhos sobre como criar índices para obter a estimativa com mais eficiência. Mas se você não quiser criar outro índice para fazer isso, outra abordagem é pedir
PostgreSQL
para fazer a estimativa para você.Se você quiser uma estimativa de uma consulta como:
O que você pode fazer é executar:
A primeira linha retornada por esta consulta será semelhante a:
E você pode analisar o número após 'rows='
Esta é a estimativa que
PostgreSQL
utiliza para o seu próprio planejamento interno, e que incorpora todas as informações quePostgreSQL
sabe incorporar.Claro que você pode usar. Veja esta página no documento do postgresql como exemplo.
Mas leve em consideração que existem várias formas de contar/estimar as linhas de uma tabela. Veja esta resposta stackoverflow para algumas maneiras diferentes.
Usando sua cláusula LIKE como exemplo, e ignorando "tabelas do sistema" você pode construir este tipo de consulta: