Files
tracksteel_app/supabase/migrations/add_performance_indexes.sql

154 lines
5.0 KiB
PL/PgSQL

-- Índices adicionais para otimização de performance
-- Baseado na análise de performance do sistema de apontamentos
-- Índices para tabela pecas
CREATE INDEX IF NOT EXISTS idx_pecas_of_number_marca
ON pecas(of_number, marca);
CREATE INDEX IF NOT EXISTS idx_pecas_etapa_fase
ON pecas(etapa_fase)
WHERE etapa_fase IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_pecas_quantidade
ON pecas(quantidade)
WHERE quantidade > 0;
CREATE INDEX IF NOT EXISTS idx_pecas_created_at
ON pecas(created_at DESC);
-- Índices para tabela componentes_peca
CREATE INDEX IF NOT EXISTS idx_componentes_peca_marca
ON componentes_peca(marca_componente);
CREATE INDEX IF NOT EXISTS idx_componentes_peca_peca_marca
ON componentes_peca(peca_id, marca_componente);
CREATE INDEX IF NOT EXISTS idx_componentes_quantidade_por_peca
ON componentes_peca(quantidade_por_peca)
WHERE quantidade_por_peca > 0;
-- Índices para tabela apontamentos_producao (otimizações específicas)
CREATE INDEX IF NOT EXISTS idx_apontamentos_data_of
ON apontamentos_producao(data_apontamento DESC, of_number);
CREATE INDEX IF NOT EXISTS idx_apontamentos_created_at_desc
ON apontamentos_producao(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_apontamentos_peca_data
ON apontamentos_producao(peca_id, data_apontamento DESC)
WHERE peca_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_apontamentos_componente_data
ON apontamentos_producao(componente_id, data_apontamento DESC)
WHERE componente_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_apontamentos_quantidade_produzida
ON apontamentos_producao(quantidade_produzida)
WHERE quantidade_produzida > 0;
-- Índice composto para consultas complexas de apontamentos
CREATE INDEX IF NOT EXISTS idx_apontamentos_of_tipo_data
ON apontamentos_producao(of_number, tipo_apontamento, data_apontamento DESC);
-- Índices para tabela processos_fabricacao
CREATE INDEX IF NOT EXISTS idx_processos_ativo_ordem_nome
ON processos_fabricacao(ativo, ordem, nome)
WHERE ativo = true;
CREATE INDEX IF NOT EXISTS idx_processos_nome
ON processos_fabricacao(nome)
WHERE ativo = true;
-- Índices para otimizar JOINs frequentes
CREATE INDEX IF NOT EXISTS idx_apontamentos_peca_processo_of
ON apontamentos_producao(peca_id, processo_id, of_number)
WHERE peca_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_apontamentos_componente_processo_of
ON apontamentos_producao(componente_id, processo_id, of_number)
WHERE componente_id IS NOT NULL;
-- Índice para consultas de estatísticas por período
CREATE INDEX IF NOT EXISTS idx_apontamentos_data_created_at
ON apontamentos_producao(data_apontamento, created_at);
-- Índice para busca rápida de últimos apontamentos
CREATE INDEX IF NOT EXISTS idx_apontamentos_of_created_desc
ON apontamentos_producao(of_number, created_at DESC);
-- Comentários sobre os índices criados
COMMENT ON INDEX idx_pecas_of_number_marca IS 'Otimiza consultas por OF e marca de peça';
COMMENT ON INDEX idx_apontamentos_data_of IS 'Otimiza consultas por data e OF nos apontamentos';
COMMENT ON INDEX idx_apontamentos_of_tipo_data IS 'Índice composto para consultas complexas de apontamentos';
COMMENT ON INDEX idx_processos_ativo_ordem_nome IS 'Otimiza listagem de processos ativos ordenados';
-- Análise de estatísticas das tabelas para o otimizador
ANALYZE pecas;
ANALYZE componentes_peca;
ANALYZE apontamentos_producao;
ANALYZE processos_fabricacao;
-- Função para monitorar uso dos índices
CREATE OR REPLACE FUNCTION get_index_usage_stats()
RETURNS TABLE (
schemaname TEXT,
relname TEXT,
indexrelname TEXT,
idx_scan BIGINT,
idx_tup_read BIGINT,
idx_tup_fetch BIGINT,
usage_ratio NUMERIC
)
LANGUAGE sql
AS $$
SELECT
schemaname,
relname,
indexrelname,
idx_scan,
idx_tup_read,
idx_tup_fetch,
CASE
WHEN idx_scan = 0 THEN 0
ELSE ROUND((idx_tup_fetch::NUMERIC / idx_tup_read::NUMERIC) * 100, 2)
END as usage_ratio
FROM pg_stat_user_indexes
WHERE schemaname = 'public'
AND relname IN ('pecas', 'componentes_peca', 'apontamentos_producao', 'processos_fabricacao')
ORDER BY idx_scan DESC, usage_ratio DESC;
$$;
COMMENT ON FUNCTION get_index_usage_stats IS 'Função para monitorar estatísticas de uso dos índices';
-- Função simplificada para análise de performance (pg_stat_statements pode não estar disponível)
CREATE OR REPLACE FUNCTION get_table_stats()
RETURNS TABLE (
schemaname TEXT,
relname TEXT,
seq_scan BIGINT,
seq_tup_read BIGINT,
idx_scan BIGINT,
idx_tup_fetch BIGINT,
n_tup_ins BIGINT,
n_tup_upd BIGINT,
n_tup_del BIGINT
)
LANGUAGE sql
AS $$
SELECT
schemaname,
relname,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch,
n_tup_ins,
n_tup_upd,
n_tup_del
FROM pg_stat_user_tables
WHERE schemaname = 'public'
AND relname IN ('pecas', 'componentes_peca', 'apontamentos_producao', 'processos_fabricacao')
ORDER BY seq_scan DESC, idx_scan DESC;
$$;
COMMENT ON FUNCTION get_table_stats IS 'Fornece estatísticas de uso das tabelas do sistema de apontamentos';