-- Migração 002: Otimiza índices para melhor performance -- Data: 2026-01-22 -- Descrição: Adiciona índices compostos e otimiza queries comuns -- Índice composto para busca por session_id + created_at CREATE INDEX IF NOT EXISTS idx_documents_session_created ON documents(session_id, created_at DESC); -- Índice para título (buscas textuais) CREATE INDEX IF NOT EXISTS idx_documents_title ON documents USING GIN (to_tsvector('english', title)); -- Índice para conteúdo (buscas textuais) CREATE INDEX IF NOT EXISTS idx_documents_content ON documents USING GIN (to_tsvector('english', content)); -- Índice para query_metrics por session_id e data CREATE INDEX IF NOT EXISTS idx_query_metrics_session_created ON query_metrics(session_id, created_at DESC); -- Índice para mensagens por chat_id CREATE INDEX IF NOT EXISTS idx_messages_chat_id ON messages(chat_id, created_at DESC); -- Estatísticas de uso (opcional - comentar se não necessário) -- Cria view materializada para estatísticas rápidas CREATE MATERIALIZED VIEW IF NOT EXISTS documents_stats AS SELECT session_id, COUNT(*) as total_docs, AVG(LENGTH(content)) as avg_content_length, MAX(created_at) as last_upload, MIN(created_at) as first_upload FROM documents GROUP BY session_id; -- Índice na view materializada CREATE UNIQUE INDEX IF NOT EXISTS idx_documents_stats_session ON documents_stats(session_id); -- Função para refresh da view (chamar periodicamente) CREATE OR REPLACE FUNCTION refresh_documents_stats() RETURNS void AS $$ BEGIN REFRESH MATERIALIZED VIEW CONCURRENTLY documents_stats; END; $$ LANGUAGE plpgsql;