Saltar a contenido

Informe de Uso de Índices McpRequestLogs

Fecha: 2026-02-01 Proyecto: Calmia Nexus Autor: Copiloto Objetivo: Verificar uso de índices en código fuente antes de eliminar


Resumen Ejecutivo

Métrica Valor
Índices analizados 14
Índices con uso en código 0 (por nombre de índice)
Columnas usadas en consultas 4 (Status, ReceivedAt, Method, ToolName)
Índices candidatos a eliminar 11
Índices a mantener 3 (PK + 2 FK)

Búsqueda de Referencias en Código

Referencias Directas a Nombres de Índices

Patrón de búsqueda Archivos encontrados Contexto
IX_McpRequestLogs 4 Solo migraciones y scripts de creación

Archivos con referencias:

  1. scripts/RunMcpLogsMigration/Program.cs - Script de migración (CREATE INDEX)
  2. Orchestrator/data/migrations/2026-01-22-mcp-request-logs.sql - Migración SQL
  3. Shared/Shared.Admin/Data/NexusDbContext.cs - Definición EF Core (HasIndex)
  4. Orchestrator/src/Orchestrator.Api/Data/Migrations/ - Snapshots EF Core

Conclusión: Ningún código de aplicación hace referencia directa a los nombres de índices.


Análisis de Columnas Usadas en Consultas

Consultas Identificadas en McpLoggingService.cs

Método Columnas WHERE Columnas ORDER BY Índice Beneficiado
GetErrorSummaryAsync Status = 'error', ReceivedAt >= since - IX_McpRequestLogs_ReceivedAt_Status
GetPerformanceSummaryAsync ReceivedAt >= since, DurationMs != null - IX_McpRequestLogs_ReceivedAt
GetBottlenecksAsync ReceivedAt >= since, DurationMs > threshold - IX_McpRequestLogs_ReceivedAt

Consultas en Orchestrator.Mcp.Remote/Program.cs

Endpoint Columnas WHERE Columnas ORDER BY Índice Beneficiado
GET /logs Status, Method (LIKE) ReceivedAt DESC IX_McpRequestLogs_ReceivedAt

Análisis Detallado por Índice

Índices SIN USO en Código (Candidatos a Eliminar)

Índice Columnas Uso en Código Recomendación
IX_McpRequestLogs_ClientId ClientId ❌ Sin consultas ELIMINAR
IX_McpRequestLogs_CorrelationId CorrelationId ❌ Solo display, sin filtro ELIMINAR
IX_McpRequestLogs_SessionId SessionId ❌ Sin consultas ELIMINAR
IX_McpRequestLogs_Method Method ⚠️ Usado con LIKE (no usa índice) ELIMINAR
IX_McpRequestLogs_ToolName ToolName ❌ Solo GroupBy, no WHERE ELIMINAR
IX_McpRequestLogs_Status Status ⚠️ Baja selectividad (~3 valores) ELIMINAR
IX_McpRequestLogs_ReceivedAt_Status ReceivedAt, Status ⚠️ Orden incorrecto para consultas ELIMINAR
IX_McpRequestLogs_Method_Status Method, Status ❌ Sin consultas exactas ELIMINAR
IX_McpRequestLogs_ToolName_ReceivedAt ToolName, ReceivedAt ❌ Sin consultas ELIMINAR
IX_McpRequestLogs_RequestParams_GIN RequestParamsJson (JSONB) ❌ Sin consultas JSONB ELIMINAR
IX_McpRequestLogs_ErrorCode ErrorCode (parcial) ❌ Solo display ELIMINAR
IX_McpRequestLogs_DurationMs DurationMs (parcial) ⚠️ Usado con > threshold EVALUAR

Índices a MANTENER

Índice Columnas Razón
McpRequestLogs_pkey Id Primary Key
IX_McpRequestLogs_OrganizationId OrganizationId Foreign Key
IX_McpRequestLogs_UserId UserId Foreign Key

Análisis de Patrones de Consulta

Patrón 1: Filtro por Status + ReceivedAt

// McpLoggingService.cs:337
.Where(l => l.Status == "error" && l.ReceivedAt >= since)
Índice recomendado: Ninguno necesario (tabla pequeña, Seq Scan eficiente)

Patrón 2: Orden por ReceivedAt

// Program.cs:537
.OrderByDescending(l => l.ReceivedAt)
.Take(Math.Min(limit, 200))
Índice recomendado: IX_McpRequestLogs_ReceivedAt podría ayudar, pero con LIMIT bajo es innecesario

Patrón 3: Filtro opcional por Status/Method

// Program.cs:530-533
if (!string.IsNullOrEmpty(status))
    query = query.Where(l => l.Status == status);
if (!string.IsNullOrEmpty(method))
    query = query.Where(l => l.Method.Contains(method)); // LIKE - no usa índice
Índice recomendado: Ninguno - Method usa CONTAINS (LIKE), no usa índice B-tree

Patrón 4: Búsqueda JSONB

-- IX_McpRequestLogs_RequestParams_GIN en RequestParamsJson
Uso en código: ❌ NO hay consultas con operadores JSONB (@>, ?, ?|, etc.)


Índice GIN (RequestParams_GIN)

Definición

CREATE INDEX IF NOT EXISTS "IX_McpRequestLogs_RequestParams_GIN"
ON "McpRequestLogs" USING GIN ("RequestParamsJson");

Uso en Código

Patrón buscado Encontrado
@> (contains JSONB) ❌ No
? (key exists) ❌ No
jsonb_path_match ❌ No
RequestParamsJson en WHERE ❌ No

Conclusión: El índice GIN fue creado de forma proactiva pero nunca se implementaron las consultas JSONB. Recomendación: ELIMINAR - No hay consultas que lo usen y GIN tiene alto costo de mantenimiento.


Resumen de Recomendaciones

Fase 1: Eliminar Inmediatamente (Sin Uso)

DROP INDEX IF EXISTS "IX_McpRequestLogs_ClientId";
DROP INDEX IF EXISTS "IX_McpRequestLogs_CorrelationId";
DROP INDEX IF EXISTS "IX_McpRequestLogs_SessionId";
DROP INDEX IF EXISTS "IX_McpRequestLogs_Method";
DROP INDEX IF EXISTS "IX_McpRequestLogs_ToolName";
DROP INDEX IF EXISTS "IX_McpRequestLogs_RequestParams_GIN";
DROP INDEX IF EXISTS "IX_McpRequestLogs_Method_Status";
DROP INDEX IF EXISTS "IX_McpRequestLogs_ToolName_ReceivedAt";

Fase 2: Eliminar con Precaución (Bajo Uso)

DROP INDEX IF EXISTS "IX_McpRequestLogs_Status";
DROP INDEX IF EXISTS "IX_McpRequestLogs_ReceivedAt_Status";
DROP INDEX IF EXISTS "IX_McpRequestLogs_ErrorCode";
DROP INDEX IF EXISTS "IX_McpRequestLogs_DurationMs";

Fase 3: Mantener

-- NO ELIMINAR: Primary Key y Foreign Keys
-- McpRequestLogs_pkey
-- IX_McpRequestLogs_OrganizationId
-- IX_McpRequestLogs_UserId

Índice Único Recomendado (Opcional)

Si se necesita rendimiento en el futuro, crear UN solo índice compuesto:

CREATE INDEX IF NOT EXISTS "IX_McpRequestLogs_Org_ReceivedAt"
ON "McpRequestLogs" ("OrganizationId", "ReceivedAt" DESC)
INCLUDE ("Status", "Method", "ToolName", "DurationMs");

Este índice cubriría todas las consultas actuales sin necesidad de 11 índices separados.


Archivos Analizados

Archivo Tipo Relevancia
Shared/Shared.Admin/Services/McpLoggingService.cs Servicio Consultas principales
Orchestrator/src/Orchestrator.Mcp.Remote/Program.cs API Endpoint /logs
Shared/Shared.Admin/Data/NexusDbContext.cs DbContext Definición de índices
scripts/RunMcpLogsMigration/Program.cs Migración Creación de índices
Orchestrator/data/migrations/2026-01-22-mcp-request-logs.sql SQL Migración original

Conclusión

11 de 14 índices en McpRequestLogs no tienen uso real en el código de aplicación.

  • Los índices fueron creados de forma proactiva anticipando consultas que nunca se implementaron
  • El índice GIN para JSONB nunca tuvo consultas correspondientes
  • La tabla es pequeña y PostgreSQL prefiere Seq Scan
  • Eliminar estos índices mejorará el rendimiento de INSERT/UPDATE sin afectar lecturas

Próximo paso: Crear script SQL de eliminación y migración EF Core.