Consultas prontas
As perguntas que um DBA faz a um banco que acabou de receber.
Cada consulta abaixo é a mesma que o console instala num clique: índices que ninguém usa, transações presas, as sentenças que custam mais. Copie o SQL, ou conecte o banco e rode com um botão.
PostgreSQL
Saúde do PostgreSQL
Dead tuples, índices não usados, transações abertas, esperas por lock, taxa de acerto de cache e as sentenças que mais custam.
- Dead tuples por tabelaTabelas em que linhas mortas se acumulam contra as vivas. Acima de 20% o autovacuum está perdendo; acima de 50% as leituras já pagam por isso.
- Índices nunca usadosÍndices não únicos sem nenhum scan desde o último reset de estatísticas, com o espaço que ocupam. Cada um é custo de escrita sem benefício de leitura.
- Transações abertas há mais de 5 minutosSessões segurando uma transação aberta, inclusive as idle in transaction, que bloqueiam o vacuum e prendem locks sem fazer nada.
- Sessões esperando por lockQuem está esperando, por quem e há quanto tempo. O resultado saudável é o vazio.
- Sentenças por tempo totalAs sentenças que mais custam no agregado: tempo médio × chamadas. Otimizar as três primeiras costuma mexer no servidor inteiro.Precisa de algo no servidor
- Maiores tabelasTamanho total, incluindo índices e TOAST. É o número para acompanhar ao longo de semanas, não uma vez só.
- Taxa de acerto de cacheFração das leituras atendidas pelos shared buffers, para tabelas e para índices. Abaixo de 99% num servidor OLTP aquecido, o conjunto de trabalho já não cabe na memória.
- Conexões por estadoSessões abertas agrupadas por estado, contra o max_connections. Muita sessão idle é pool grande demais; muita sessão ativa é servidor pequeno demais.
- Sequences acima de 80% da faixaUma sequence inteira que chega ao máximo para os inserts daquela tabela. Esta consulta pega isso meses antes.
- Atraso de replicaçãoPara um primário com réplicas: quanto cada uma está atrás, em bytes e em tempo. Vem vazio num servidor sem réplicas.
MySQL
Saúde do MySQL
Tabelas fragmentadas, tabelas sem chave primária, consultas longas, as sentenças que mais custam e o buffer pool.
- Maiores tabelas e o espaço livre delasDados, índices e espaço recuperável por tabela. Um data_free grande é fragmentação que um OPTIMIZE TABLE recuperaria.
- Tabelas sem chave primáriaO InnoDB cria uma chave oculta para elas, a replicação por linha fica lenta nelas e as ferramentas de alteração de schema online as recusam.
- Consultas rodando há mais de 60 segundosTudo na process list que está executando há mais de um minuto.
- Sentenças por tempo totalAgrupadas por digest: os formatos de sentença que mais custam somando todas as chamadas.Precisa de algo no servidor
- Índices nunca usadosÍndices sem nenhuma leitura desde que o servidor subiu, pelo performance_schema. Reiniciar zera os contadores — confie no resultado depois de alguns dias no ar.Precisa de algo no servidor
- Conexões por comandoSessões abertas agrupadas pelo que estão fazendo, contra o max_connections.
- Taxa de acerto do buffer pool do InnoDBFração das leituras de página atendidas pela memória. Abaixo de 99% num servidor movimentado, o buffer pool é menor que o conjunto de trabalho.
SQL Server
Saúde do SQL Server
Bloqueios, índices ausentes e não usados, as consultas que queimam CPU, estatísticas de espera e tamanho das tabelas.
- Sessões bloqueadasRequisições esperando por outra sessão, com o texto dos dois lados. O saudável é vir vazio.
- Índices ausentes que o otimizador pediuAs sugestões do próprio engine, ordenadas pela melhora que ele espera. Trate as primeiras como candidatas, não como ordens.
- Índices escritos e nunca lidosÍndices não clusterizados com atualizações e nenhum seek, scan ou lookup desde o último restart.
- Consultas por CPU totalPlanos em cache ordenados pelo tempo de worker somado de todas as execuções.
- Principais esperas desde o restartCom o que o servidor passa o tempo esperando. Filtra as esperas benignas de segundo plano.
- Maiores tabelasLinhas e espaço reservado por tabela, a partir das estatísticas de partição.
- Sessões por statusSessões de usuário agrupadas por status (running, sleeping, dormant), de sys.dm_exec_sessions. Muita sessão sleeping costuma indicar um pool de conexões grande demais.