154 lines
5.0 KiB
PL/PgSQL
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'; |