🚀 Initial commit: Versão atual do TrackSteel APP
This commit is contained in:
154
supabase/migrations/add_performance_indexes.sql
Normal file
154
supabase/migrations/add_performance_indexes.sql
Normal file
@@ -0,0 +1,154 @@
|
||||
-- Í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';
|
||||
Reference in New Issue
Block a user