File size: 1,631 Bytes
1b447de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
-- 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;