|
1375 | 1375 | "tags": [ |
1376 | 1376 | "QueryAnalysis" |
1377 | 1377 | ], |
1378 | | - "summary": "Анализирует запрос алгоритмически + по флагу useLlm может выдать рекомендации от LLM и оптимизированный запрос", |
| 1378 | + "summary": "Анализирует запрос\n1 - системными правилами для sql и explain\n2 - по флагу useLlm может выдать проблемы и рекомендации от LLM а также сравнение двух запросов\n3 - по ruleIds может проверять запрос по кастомным правилам, если ruleIds не передали, будет проверять по всем правилам", |
1379 | 1379 | "parameters": [ |
1380 | 1380 | { |
1381 | 1381 | "name": "queryId", |
|
1435 | 1435 | "tags": [ |
1436 | 1436 | "SqlAnalyzeRule" |
1437 | 1437 | ], |
| 1438 | + "summary": "Ищет все кастомные правила для аналища SQL", |
1438 | 1439 | "parameters": [ |
1439 | 1440 | { |
1440 | 1441 | "name": "skip", |
|
1502 | 1503 | "tags": [ |
1503 | 1504 | "SqlAnalyzeRule" |
1504 | 1505 | ], |
| 1506 | + "summary": "Создает новое кастомное правило для анализа SQL", |
1505 | 1507 | "requestBody": { |
1506 | 1508 | "content": { |
1507 | 1509 | "application/json": { |
|
1532 | 1534 | "tags": [ |
1533 | 1535 | "SqlAnalyzeRule" |
1534 | 1536 | ], |
| 1537 | + "summary": "Обновляет кастомное правило", |
1535 | 1538 | "requestBody": { |
1536 | 1539 | "content": { |
1537 | 1540 | "application/json": { |
|
1564 | 1567 | "tags": [ |
1565 | 1568 | "SqlAnalyzeRule" |
1566 | 1569 | ], |
| 1570 | + "summary": "Удаляет кастомное правило", |
1567 | 1571 | "parameters": [ |
1568 | 1572 | { |
1569 | 1573 | "name": "id", |
|
2103 | 2107 | "additionalProperties": false, |
2104 | 2108 | "description": "Статистика автовакуума PostgreSQL\nСодержит метрики для мониторинга и анализа процесса автоматической очистки базы данных\nАвтовакуум удаляет \"мертвые\" tuple'ы и обновляет статистику для оптимизатора запросов" |
2105 | 2109 | }, |
| 2110 | + "BufferStats": { |
| 2111 | + "type": "object", |
| 2112 | + "properties": { |
| 2113 | + "sharedHit": { |
| 2114 | + "type": "integer", |
| 2115 | + "description": "Shared buffer hits.", |
| 2116 | + "format": "int64" |
| 2117 | + }, |
| 2118 | + "sharedRead": { |
| 2119 | + "type": "integer", |
| 2120 | + "description": "Shared buffer reads (from disk).", |
| 2121 | + "format": "int64" |
| 2122 | + }, |
| 2123 | + "localHit": { |
| 2124 | + "type": "integer", |
| 2125 | + "description": "Local buffer hits.", |
| 2126 | + "format": "int64" |
| 2127 | + }, |
| 2128 | + "localRead": { |
| 2129 | + "type": "integer", |
| 2130 | + "description": "Local buffer reads.", |
| 2131 | + "format": "int64" |
| 2132 | + }, |
| 2133 | + "tempRead": { |
| 2134 | + "type": "integer", |
| 2135 | + "description": "Temp blocks read (from temp files).", |
| 2136 | + "format": "int64" |
| 2137 | + }, |
| 2138 | + "tempWritten": { |
| 2139 | + "type": "integer", |
| 2140 | + "description": "Temp blocks written (to temp files).", |
| 2141 | + "format": "int64" |
| 2142 | + } |
| 2143 | + }, |
| 2144 | + "additionalProperties": false, |
| 2145 | + "description": "Метрики буферов, агрегированные для узла." |
| 2146 | + }, |
2106 | 2147 | "CacheAnalysisResponse": { |
2107 | 2148 | "type": "object", |
2108 | 2149 | "properties": { |
|
2452 | 2493 | "additionalProperties": false, |
2453 | 2494 | "description": "Описание результата разбора EXPLAIN (FORMAT JSON)." |
2454 | 2495 | }, |
| 2496 | + "ExplainRootPlan": { |
| 2497 | + "type": "object", |
| 2498 | + "properties": { |
| 2499 | + "commandType": { |
| 2500 | + "type": "string", |
| 2501 | + "description": "Команда: SELECT/UPDATE/INSERT/DELETE и т.д., если доступно.", |
| 2502 | + "nullable": true |
| 2503 | + }, |
| 2504 | + "rootNode": { |
| 2505 | + "$ref": "#/components/schemas/PlanNode" |
| 2506 | + }, |
| 2507 | + "planningTimeMs": { |
| 2508 | + "type": "number", |
| 2509 | + "description": "Время планирования в миллисекундах (если предоставлено).", |
| 2510 | + "format": "double", |
| 2511 | + "nullable": true |
| 2512 | + }, |
| 2513 | + "executionTimeMs": { |
| 2514 | + "type": "number", |
| 2515 | + "description": "Время выполнения в миллисекундах (если предоставлено).", |
| 2516 | + "format": "double", |
| 2517 | + "nullable": true |
| 2518 | + }, |
| 2519 | + "settings": { |
| 2520 | + "type": "object", |
| 2521 | + "additionalProperties": {}, |
| 2522 | + "description": "Дополнительные настройки/параметры из EXPLAIN.", |
| 2523 | + "nullable": true |
| 2524 | + } |
| 2525 | + }, |
| 2526 | + "additionalProperties": false, |
| 2527 | + "description": "Корневой план EXPLAIN, содержит метрики времени и общий узел плана." |
| 2528 | + }, |
2455 | 2529 | "GuidSimpleDto": { |
2456 | 2530 | "type": "object", |
2457 | 2531 | "properties": { |
|
2928 | 3002 | "additionalProperties": false, |
2929 | 3003 | "description": "Модель для хранения информации о заблокированных lock'ах PostgreSQL" |
2930 | 3004 | }, |
| 3005 | + "PlanComparisonDto": { |
| 3006 | + "type": "object", |
| 3007 | + "properties": { |
| 3008 | + "cost": { |
| 3009 | + "$ref": "#/components/schemas/PlanPointComparsionResult" |
| 3010 | + }, |
| 3011 | + "rows": { |
| 3012 | + "$ref": "#/components/schemas/PlanPointComparsionResult" |
| 3013 | + }, |
| 3014 | + "width": { |
| 3015 | + "$ref": "#/components/schemas/PlanPointComparsionResult" |
| 3016 | + }, |
| 3017 | + "seqScanCount": { |
| 3018 | + "$ref": "#/components/schemas/PlanPointComparsionResult" |
| 3019 | + }, |
| 3020 | + "nodeCount": { |
| 3021 | + "$ref": "#/components/schemas/PlanPointComparsionResult" |
| 3022 | + }, |
| 3023 | + "oldJoinTypes": { |
| 3024 | + "type": "string", |
| 3025 | + "nullable": true |
| 3026 | + }, |
| 3027 | + "newJoinTypes": { |
| 3028 | + "type": "string", |
| 3029 | + "nullable": true |
| 3030 | + } |
| 3031 | + }, |
| 3032 | + "additionalProperties": false |
| 3033 | + }, |
2931 | 3034 | "PlanFinding": { |
2932 | 3035 | "type": "object", |
2933 | 3036 | "properties": { |
|
3003 | 3106 | "additionalProperties": false, |
3004 | 3107 | "description": "Описание одного найденного \"находки\" (issue) по плану." |
3005 | 3108 | }, |
| 3109 | + "PlanNode": { |
| 3110 | + "type": "object", |
| 3111 | + "properties": { |
| 3112 | + "nodeType": { |
| 3113 | + "type": "string", |
| 3114 | + "description": "Node Type, как указан в JSON (например, \"Seq Scan\", \"Hash Join\").", |
| 3115 | + "nullable": true |
| 3116 | + }, |
| 3117 | + "shortNodeType": { |
| 3118 | + "type": "string", |
| 3119 | + "description": "Маппинг NodeType на enum, если возможно.", |
| 3120 | + "nullable": true |
| 3121 | + }, |
| 3122 | + "startupCost": { |
| 3123 | + "type": "number", |
| 3124 | + "description": "Оценочная startup cost.", |
| 3125 | + "format": "double", |
| 3126 | + "nullable": true |
| 3127 | + }, |
| 3128 | + "totalCost": { |
| 3129 | + "type": "number", |
| 3130 | + "description": "Оценочная total cost.", |
| 3131 | + "format": "double", |
| 3132 | + "nullable": true |
| 3133 | + }, |
| 3134 | + "planRows": { |
| 3135 | + "type": "number", |
| 3136 | + "description": "Оценка планировщика: планируемое количество строк.", |
| 3137 | + "format": "double", |
| 3138 | + "nullable": true |
| 3139 | + }, |
| 3140 | + "planWidth": { |
| 3141 | + "type": "number", |
| 3142 | + "description": "Оценочная ширина строки (в байтах).", |
| 3143 | + "format": "double", |
| 3144 | + "nullable": true |
| 3145 | + }, |
| 3146 | + "actualStartupTimeMs": { |
| 3147 | + "type": "number", |
| 3148 | + "description": "Фактическое стартовое время в миллисекундах (ANALYZE).", |
| 3149 | + "format": "double", |
| 3150 | + "nullable": true |
| 3151 | + }, |
| 3152 | + "actualTotalTimeMs": { |
| 3153 | + "type": "number", |
| 3154 | + "description": "Фактическое суммарное время в миллисекундах (ANALYZE).", |
| 3155 | + "format": "double", |
| 3156 | + "nullable": true |
| 3157 | + }, |
| 3158 | + "actualRows": { |
| 3159 | + "type": "number", |
| 3160 | + "description": "Фактическое количество строк (single loop).", |
| 3161 | + "format": "double", |
| 3162 | + "nullable": true |
| 3163 | + }, |
| 3164 | + "actualLoops": { |
| 3165 | + "type": "integer", |
| 3166 | + "description": "Количество выполнений узла (loops).", |
| 3167 | + "format": "int32", |
| 3168 | + "nullable": true |
| 3169 | + }, |
| 3170 | + "buffers": { |
| 3171 | + "$ref": "#/components/schemas/BufferStats" |
| 3172 | + }, |
| 3173 | + "nodeSpecific": { |
| 3174 | + "type": "object", |
| 3175 | + "additionalProperties": {}, |
| 3176 | + "description": "Словарь с произвольными свойствами узла (Index Name, Index Cond, Sort Method, Batches, Disk Usage и т.д.).", |
| 3177 | + "nullable": true |
| 3178 | + }, |
| 3179 | + "children": { |
| 3180 | + "type": "array", |
| 3181 | + "items": { |
| 3182 | + "$ref": "#/components/schemas/PlanNode" |
| 3183 | + }, |
| 3184 | + "description": "Дочерние узлы плана.", |
| 3185 | + "nullable": true |
| 3186 | + } |
| 3187 | + }, |
| 3188 | + "additionalProperties": false, |
| 3189 | + "description": "Узел плана EXPLAIN. NodeSpecific содержит все детальные поля, которые не попали в стандартные свойства." |
| 3190 | + }, |
| 3191 | + "PlanPointComparsionResult": { |
| 3192 | + "type": "object", |
| 3193 | + "properties": { |
| 3194 | + "old": { |
| 3195 | + "type": "number", |
| 3196 | + "format": "double" |
| 3197 | + }, |
| 3198 | + "new": { |
| 3199 | + "type": "number", |
| 3200 | + "format": "double" |
| 3201 | + }, |
| 3202 | + "differencePercent": { |
| 3203 | + "type": "number", |
| 3204 | + "format": "double", |
| 3205 | + "nullable": true |
| 3206 | + } |
| 3207 | + }, |
| 3208 | + "additionalProperties": false |
| 3209 | + }, |
3006 | 3210 | "ProblematicTable": { |
3007 | 3211 | "type": "object", |
3008 | 3212 | "properties": { |
|
3085 | 3289 | "nullable": true |
3086 | 3290 | }, |
3087 | 3291 | "explainResult": { |
3088 | | - "type": "string", |
3089 | | - "description": "Результат выполнения EXPLAIN для запроса", |
3090 | | - "nullable": true |
| 3292 | + "$ref": "#/components/schemas/ExplainRootPlan" |
3091 | 3293 | }, |
3092 | 3294 | "algorithmRecommendation": { |
3093 | 3295 | "$ref": "#/components/schemas/SqlAlgorithmAnalysisResult" |
3094 | 3296 | }, |
3095 | 3297 | "llmRecommendations": { |
3096 | | - "$ref": "#/components/schemas/LlmAnswer" |
| 3298 | + "$ref": "#/components/schemas/SqlLlmAnalysisResult" |
3097 | 3299 | }, |
3098 | | - "findindCustomRules": { |
3099 | | - "type": "array", |
3100 | | - "items": { |
3101 | | - "type": "string", |
3102 | | - "format": "uuid" |
3103 | | - }, |
3104 | | - "nullable": true |
| 3300 | + "explainComparisonDto": { |
| 3301 | + "$ref": "#/components/schemas/PlanComparisonDto" |
3105 | 3302 | } |
3106 | 3303 | }, |
3107 | 3304 | "additionalProperties": false, |
|
3149 | 3346 | "nullable": true |
3150 | 3347 | }, |
3151 | 3348 | "explainResult": { |
3152 | | - "type": "string", |
3153 | | - "description": "Резульатат выполнения EXPLAIN для запроса", |
3154 | | - "nullable": true |
| 3349 | + "$ref": "#/components/schemas/ExplainRootPlan" |
3155 | 3350 | }, |
3156 | 3351 | "dbConnectionId": { |
3157 | 3352 | "type": "string", |
|
3390 | 3585 | }, |
3391 | 3586 | "additionalProperties": false |
3392 | 3587 | }, |
| 3588 | + "SqlLlmAnalysisResult": { |
| 3589 | + "type": "object", |
| 3590 | + "properties": { |
| 3591 | + "llmAnswer": { |
| 3592 | + "$ref": "#/components/schemas/LlmAnswer" |
| 3593 | + }, |
| 3594 | + "explainResult": { |
| 3595 | + "$ref": "#/components/schemas/ExplainRootPlan" |
| 3596 | + } |
| 3597 | + }, |
| 3598 | + "additionalProperties": false |
| 3599 | + }, |
3393 | 3600 | "StaticAnalysisPoint": { |
3394 | 3601 | "type": "object", |
3395 | 3602 | "properties": { |
|
3438 | 3645 | 40, |
3439 | 3646 | 41, |
3440 | 3647 | 42, |
3441 | | - 43 |
| 3648 | + 43, |
| 3649 | + 44 |
3442 | 3650 | ], |
3443 | 3651 | "type": "integer", |
3444 | 3652 | "description": "Коды статических правил анализа SQL.", |
|
0 commit comments