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:
scripts/RunMcpLogsMigration/Program.cs- Script de migración (CREATE INDEX)Orchestrator/data/migrations/2026-01-22-mcp-request-logs.sql- Migración SQLShared/Shared.Admin/Data/NexusDbContext.cs- Definición EF Core (HasIndex)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¶
Índice recomendado: Ninguno necesario (tabla pequeña, Seq Scan eficiente)Patrón 2: Orden por ReceivedAt¶
Í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
Patrón 4: Búsqueda JSONB¶
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.