23.2. O coletor de estatísticas

O coletor de estatísticas do PostgreSQL é um subsistema de apoio a coleta e relatório de informações sobre as atividades do servidor. Atualmente, o coletor pode contar acessos a tabelas e índices em termos de blocos de disco e linhas individuais. Também apóia a determinação exata do comando sendo executado no momento pelos outros processos servidor.

23.2.1. Configuração da coleta de estatísticas

Uma vez que a coleta de estatísticas adiciona alguma sobrecarga à execução do comando, o sistema pode ser configurado para coletar informações, ou não. Isto é controlado por parâmetros de configuração, normalmente definidos no arquivo postgresql.conf (para obter detalhes sobre como definir os parâmetros de configuração deve ser consultada a Seção 16.4 ).

O parâmetro stats_start_collector deve ser definido como true para que o coletor de estatísticas seja ativado. Esta é a definição padrão e recomendada, mas pode ser desativada se não houver interesse nas estatísticas e for desejado eliminar até a última gota de sobrecarga (Entretanto, provavelmente o ganho será pequeno). Deve ser observado que esta opção não pode ser mudada enquanto o servidor está executando.

Os parâmetros stats_command_string, stats_block_level e stats_row_level controlam a quantidade de informação que é enviada para o coletor e, portanto, determinam quanta sobrecarga ocorre em tempo de execução. Determinam se o processo servidor envia para o coletor a cadeia de caracteres do comando corrente, as estatísticas de acesso no nível de bloco de disco, e as estatísticas de acesso no nível de linha, respectivamente. Normalmente estes parâmetros são definidos no arquivo postgresql.conf e, portanto, se aplicam a todos os processos servidor, mas é possível ativá-los ou desativá-los para sessões individuais utilizando o comando SET (Para evitar que os usuários comuns escondam suas atividades do administrador, somente os superusuários podem alterar estes parâmetros através do comando SET).

Nota: Uma vez que o valor dos parâmetros stats_command_string, stats_block_level e stats_row_level são false por padrão, muito poucas estatísticas são coletadas na configuração padrão. Ativar uma ou mais destas variáveis de configuração aumenta, significativamente, a quantidade de dados úteis produzidos pelo coletor de estatísticas, ao custo de uma sobrecarga adicional em tempo de execução.

23.2.2. Ver as estatísticas coletadas

Estão disponíveis diversas visões pré-definidas para mostrar os resultados das estatísticas coletadas, conforme listado na Tabela 23-1. Como alternativa, podem ser construídas visões personalizadas utilizando as funções de estatísticas subjacentes.

Ao se utilizar as estatísticas para monitorar a atividade corrente, é importante ter em mente que as informações não são atualizadas instantaneamente. Cada processo servidor individual transmite os novos contadores de acesso a bloco e a linha para o coletor logo antes de ficar ocioso; portanto, um comando ou transação ainda em progresso não afeta os totais exibidos. Também, o próprio coletor emite um novo relatório no máximo uma vez a cada pgstat_stat_interval milissegundos (500 por padrão). Portanto, as informações mostradas são anteriores à atividade corrente. A informação do comando corrente é enviada para o coletor imediatamente, mas ainda está sujeita ao retardo de pgstat_stat_interval antes de se tornar visível.

Outro ponto importante é que, quando se solicita a um processo servidor para mostrar uma destas estatísticas, primeiro este busca os relatórios mais recentes emitidos pelo processo coletor, e depois continua utilizando este instantâneo para todas as visões e funções de estatística até o término da transação corrente. Portanto, as estatísticas parecem não mudar enquanto se permanece na transação corrente. Isto é uma característica, e não um erro, porque permite realizar várias consultas às estatísticas e correlacionar os resultados sem se preocupar com números variando por baixo. Se desejar ver novos resultados a cada consulta, certifique-se que as consultas estão fora de qualquer bloco de transação.

Tabela 23-1. Visões de estatísticas padrão

Nome da visão Descrição
pg_stat_activity Uma linha por processo servidor, mostrando o ID do processo, o banco de dados, o usuário, o comando corrente e a hora em que o comando corrente começou a executar. As colunas que mostram os dados do comando corrente somente estão disponíveis quando o parâmetro stats_command_string está ativado. Além disso, estas colunas mostram o valor nulo a menos que o usuário consultando a visão seja um superusuário, ou o mesmo usuário dono do processo sendo mostrado (Deve ser observado que devido ao retardo do que é informado pelo coletor, o comando corrente somente será mostrado no caso dos comandos com longo tempo de execução).
pg_stat_database Uma linha por banco de dados, mostrando o número de processos servidor ativos, total de transações efetivadas e total de transações canceladas neste banco de dados, total de blocos de disco lidos e total de acertos no buffer (ou seja, solicitações de leitura de bloco evitadas por encontrar o bloco no cache do buffer).
pg_stat_all_tables Para cada tabela do banco de dados corrente, o número total de: varreduras seqüenciais e de índice; linhas retornadas por cada tipo de varredura; linhas inseridas, atualizadas e excluídas.
pg_stat_sys_tables O mesmo que pg_stat_all_tables, exceto que somente são mostradas as tabelas do sistema.
pg_stat_user_tables O mesmo que pg_stat_all_tables, exceto que somente são mostradas as tabelas de usuário.
pg_stat_all_indexes Para cada índice do banco de dados corrente, o total de varreduras de índice que utilizaram este índice, o número de linhas do índice lidas, e o número de linhas da tabela buscadas com sucesso (Pode ser menor quando existem entradas do índice apontando para linhas da tabela expiradas)
pg_stat_sys_indexes O mesmo que pg_stat_all_indexes, exceto que somente são mostrados os índices das tabelas do sistema.
pg_stat_user_indexes O mesmo que pg_stat_all_indexes, exceto que somente são mostrados os índices das tabelas de usuário.
pg_statio_all_tables Para cada tabela do banco de dados corrente, o número total de blocos de disco da tabela lidos, o número de acertos no buffer, o número de blocos de disco lidos e acertos no buffer para todos os índices da tabela, o número de blocos de disco lidos e acertos no buffer para a tabela auxiliar TOAST da tabela (se houver), e o número de blocos de disco lidos e acertos no buffer para o índice da tabela TOAST.
pg_statio_sys_tables O mesmo que pg_statio_all_tables, exceto que somente são mostradas as tabelas do sistema.
pg_statio_user_tables O mesmo que pg_statio_all_tables, exceto que somente são mostradas as tabelas de usuário.
pg_statio_all_indexes Para cada índice do banco de dados corrente, o número de blocos de disco lidos e de acertos no buffer para o índice.
pg_statio_sys_indexes O mesmo que pg_statio_all_indexes, exceto que somente são mostrados os índices das tabelas do sistema.
pg_statio_user_indexes O mesmo que pg_statio_all_indexes, exceto que somente são mostrados os índices das tabelas de usuário.
pg_statio_all_sequences Para cada objeto de seqüência do banco de dados corrente, o número de blocos de disco lidos e de acertos no buffer para a seqüência.
pg_statio_sys_sequences O mesmo que pg_statio_all_sequences, exceto que somente são mostradas as seqüências do sistema (Atualmente não está definida nenhuma seqüência do sistema e, portanto, esta visão está sempre vazia).
pg_statio_user_sequences O mesmo que pg_statio_all_sequences, exceto que somente são mostradas as seqüências de usuário.

As estatísticas por índice são particularmente úteis para determinar quais índices estão sendo utilizados e quão efetivos são.

As visões pg_statio_ são úteis, principalmente, para determinar a efetividade do cache do buffer. Quando o número de leituras físicas no disco é muito menor do que o número de acertos no buffer, então o cache está respondendo à maioria das solicitações de leitura, evitando chamadas ao núcleo. Entretanto, estas estatísticas não fornecem toda a história: devido à forma como o PostgreSQL trata a E/S em disco, dados que não estão no cache do buffer do PostgreSQL podem estar no cache de E/S do núcleo e, portanto, podem ser lidos sem que haja necessidade de uma leitura física. Os usuários interessados em obter informações mais detalhadas sobre o comportamento de E/S do PostgreSQL, são aconselhados a utilizar o coletor de estatísticas do PostgreSQL em combinação com os utilitários do sistema operacional que permitem analisar o tratamento da E/S pelo núcleo.

Podem ser criadas outras formas de ver as estatísticas, escrevendo consultas que utilizam as mesmas funções subjacentes de acesso às estatísticas utilizadas pelas visões padrão. Esta funções estão listadas na Tabela 23-2. As funções de acesso por banco de dados, recebem como argumento o OID do banco de dados que identifica para qual banco de dados é o relatório. As funções por tabela e por índice recebem o OID da tabela ou do índice, respectivamente (Deve ser observado que somente podem ser vistos por estas funções as tabelas e índices presentes no banco de dados corrente). As funções de acesso por processo servidor recebem o número de ID do processo servidor, que varia de um ao número de processos servidor ativos no momento.

Tabela 23-2. Funções de acesso às estatísticas

Função Tipo retornado Descrição
pg_stat_get_db_numbackends(oid) integer Número de processos servidor ativos conectados ao banco de dados
pg_stat_get_db_xact_commit(oid) bigint Transações efetivadas no banco de dados
pg_stat_get_db_xact_rollback(oid) bigint Transações canceladas no banco de dados
pg_stat_get_db_blocks_fetched(oid) bigint Número de solicitações de busca de blocos de disco para o banco de dados
pg_stat_get_db_blocks_hit(oid) bigint Número de solicitações de busca de blocos de disco para o banco de dados encontradas no cache
pg_stat_get_numscans(oid) bigint Número de varreduras seqüenciais realizadas quando o argumento é uma tabela, ou o número de varreduras de índice quando o argumento é um índice
pg_stat_get_tuples_returned(oid) bigint Número de linhas lidas por varreduras seqüenciais quando o argumento é uma tabela, ou o número de linhas do índice lidas quando o argumento é um índice
pg_stat_get_tuples_fetched(oid) bigint Número de linhas válidas (não expiradas) da tabela buscadas por varreduras seqüenciais quando o argumento é uma tabela, ou buscadas por varreduras de índice, utilizando este índice, quando o argumento é um índice
pg_stat_get_tuples_inserted(oid) bigint Número de linhas inseridas na tabela
pg_stat_get_tuples_updated(oid) bigint Número de linhas atualizadas na tabela
pg_stat_get_tuples_deleted(oid) bigint Número de linhas excluídas da tabela
pg_stat_get_blocks_fetched(oid) bigint Número de solicitações de busca de bloco de disco para a tabela ou índice
pg_stat_get_blocks_hit(oid) bigint Número de solicitações de busca de bloco de disco encontradas no cache para a tabela ou o índice
pg_stat_get_backend_idset() conjunto de integer Conjunto de IDs de processos servidor ativos no momento (de 1 ao número de processos servidor ativos). Veja o exemplo de utilização no texto.
pg_backend_pid() integer ID de processo do processo servidor conectado à sessão corrente
pg_stat_get_backend_pid(integer) integer ID de processo do processo servidor especificado
pg_stat_get_backend_dbid(integer) oid ID de banco de dados do processo servidor especificado
pg_stat_get_backend_userid(integer) oid ID de usuário do processo servidor especificado
pg_stat_get_backend_activity(integer) text Comando ativo do processo servidor especificado (nulo se o usuário corrente não for um superusuário nem o mesmo usuário da sessão sendo consultada, ou se stats_command_string não estiver ativo)
pg_stat_get_backend_activity_start(integer) timestamp with time zone A hora em que o comando executando no momento, no processo servidor especificado, começou (nulo se o usuário corrente não for um superusuário nem o mesmo usuário da sessão sendo consultada, ou se stats_command_string não estiver ativo)
pg_stat_reset() boolean Reinicia todas as estatísticas atualmente coletadas

Nota: pg_stat_get_db_blocks_fetched menos pg_stat_get_db_blocks_hit fornece o número de chamadas à função read() do núcleo feitas para a tabela, índice ou banco de dados; mas o número verdadeiro de leituras físicas é geralmente menor por causa da "buferização" no nível do núcleo.

A função pg_stat_get_backend_idset fornece uma maneira conveniente de gerar uma linha para cada processo servidor ativo. Por exemplo, para mostrar o PID e o comando corrente de todos os processos servidor:

SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
       pg_stat_get_backend_activity(s.backendid) AS current_query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
SourceForge.net Logo CSS válido!