feat(sql-analysis): 完善慢 SQL 监控与执行计划诊断

- 完善慢查询采集、聚合、迁移与跨进程持久化

- 加固只读诊断边界并补齐多数据库执行计划解析

- 优化慢 SQL 面板、计划图、响应式布局与交互体验

- 补充后端、前端及 SQL Server 会话回归测试
This commit is contained in:
Syngnat
2026-07-11 16:25:07 +08:00
parent 5c80f6e9a2
commit 034e968888
49 changed files with 4817 additions and 686 deletions

View File

@@ -7425,10 +7425,11 @@
"sql_analysis.backend.error.explain_result_empty": "Набор результатов EXPLAIN пуст",
"sql_analysis.backend.error.explain_result_missing": "Набор результатов EXPLAIN не был возвращён",
"sql_analysis.backend.error.query_required": "SQL-запрос не может быть пустым",
"sql_analysis.backend.error.select_only": "Диагностика поддерживает только запросы SELECT / WITH. Для операций записи используйте режим EXPLAIN PLAN (поддержка PR2).",
"sql_analysis.backend.error.select_only": "Диагностика поддерживает только один запрос SELECT / WITH без записи; операции записи и несколько выражений запрещены.",
"sql_analysis.backend.error.unsupported_db_type": "Текущий источник данных ({{dbType}}) пока не поддерживает диагностику SQL. На первом этапе поддерживаются MySQL/PostgreSQL/SQLite/ClickHouse/Oracle/SQLServer/OceanBase.",
"sql_analysis.backend.message.completed": "Диагностика завершена",
"sql_analysis.explain.empty": "Введите SQL и запустите диагностику",
"sql_analysis.explain.action.retry": "Повторить диагностику",
"sql_analysis.explain.error.query_required": "Текст запроса пуст",
"sql_analysis.explain.error.run_failed": "Диагностика не выполнена",
"sql_analysis.explain.error.title": "Диагностика не выполнена: ",
@@ -7472,12 +7473,25 @@
"sql_analysis.sidebar.warning.full_scan": "Обнаружено полное сканирование таблицы",
"sql_analysis.sidebar.warning.temp_table": "Используется временная таблица",
"sql_analysis.slow_query.current_connection": "(текущее подключение)",
"sql_analysis.slow_query.action.copy": "Копировать SQL",
"sql_analysis.slow_query.action.load": "Загрузить для диагностики",
"sql_analysis.slow_query.action.load_more": "Загрузить ещё (показано {{shown}} / {{total}})",
"sql_analysis.slow_query.action.retry": "Повторить",
"sql_analysis.slow_query.action.view_full": "Показать полный SQL",
"sql_analysis.slow_query.clear_confirm.description": "История медленных SQL текущего подключения будет удалена без возможности восстановления.",
"sql_analysis.slow_query.clear_confirm.title": "Очистить историю медленных SQL?",
"sql_analysis.slow_query.details.title": "Полный SQL",
"sql_analysis.slow_query.empty": "Записей о медленных запросах пока нет (порог {{threshold}}ms)",
"sql_analysis.slow_query.error.clear_failed": "Не удалось очистить",
"sql_analysis.slow_query.error.copy_failed": "Не удалось скопировать SQL",
"sql_analysis.slow_query.error.load_failed": "Не удалось загрузить",
"sql_analysis.slow_query.error.title": "Не удалось загрузить: ",
"sql_analysis.slow_query.loading": "Загрузка истории медленных запросов...",
"sql_analysis.slow_query.message.cleared": "История медленных запросов очищена",
"sql_analysis.slow_query.message.copied": "SQL скопирован",
"sql_analysis.slow_query.not_diagnosable": "Для диагностики можно загрузить только один запрос SELECT/WITH без записи; эта запись содержит пакет или операцию записи.",
"sql_analysis.slow_query.metric.average_duration": "Среднее {{duration}}",
"sql_analysis.slow_query.metric.executions": "Запусков: {{count}}",
"sql_analysis.slow_query.metric.rows_read": "Прочитано",
"sql_analysis.slow_query.metric.rows_returned": "Возвращено",
"sql_analysis.slow_query.preview.empty": "(нет предпросмотра SQL)",
@@ -7488,14 +7502,28 @@
"sql_analysis.slow_query.relative.hours_ago": "{{count}} ч назад",
"sql_analysis.slow_query.relative.just_now": "Только что",
"sql_analysis.slow_query.relative.minutes_ago": "{{count}} мин. назад",
"sql_analysis.slow_query.search.aria_label": "Поиск в истории медленных SQL",
"sql_analysis.slow_query.search.empty": "Подходящих медленных SQL нет",
"sql_analysis.slow_query.search.placeholder": "Поиск по SQL, типу БД или отпечатку",
"sql_analysis.slow_query.scope_note": "Учитывается только локальная история запросов, успешно выполненных через GoNavi за {{threshold}}мс или больше. Показывается до {{limit}} шаблонов SQL; это не журнал медленных запросов сервера БД.",
"sql_analysis.slow_query.sort.aria_label": "Сортировка медленных SQL",
"sql_analysis.slow_query.sort.duration": "По длительности",
"sql_analysis.slow_query.sort.frequency": "По частоте",
"sql_analysis.slow_query.sort.recent": "По времени",
"sql_analysis.slow_query.sort.rows_returned": "По возвращённым строкам",
"sql_analysis.slow_query.sort.rows_read": "По прочитанным строкам",
"sql_analysis.slow_query.summary.executions": "Выполнений: {{count}}",
"sql_analysis.slow_query.summary.max_duration": "Самый медленный: {{duration}}",
"sql_analysis.slow_query.summary.rows_returned": "Возвращено до {{count}} строк",
"sql_analysis.slow_query.summary.statements": "Запросов: {{count}}",
"sql_analysis.slow_query.title": "История медленных SQL",
"sql_analysis.slow_query.tooltip.clear_current": "Очистить историю текущего подключения",
"sql_analysis.slow_query.truncated": "SQL обрезан. Его можно скопировать, но нельзя безопасно загрузить для диагностики.",
"sql_analysis.slow_query.unsupported_diagnosis": "Диагностика плана выполнения недоступна для этого источника данных. SQL по-прежнему можно просмотреть или скопировать.",
"sql_analysis.workbench.action.run": "Запустить диагностику",
"sql_analysis.workbench.alert.connection_missing_description": "Снова выберите корректное подключение перед повторным открытием рабочей области анализа SQL.",
"sql_analysis.workbench.alert.connection_missing_title": "Подключение для этой рабочей области больше недоступно",
"sql_analysis.workbench.editor.aria_label": "SQL для диагностики",
"sql_analysis.workbench.editor.hint": "Можно сразу подставить запись из списка медленных SQL",
"sql_analysis.workbench.editor.placeholder": "Введите SQL для диагностики или подставьте его, выбрав запись из списка медленных SQL",
"sql_analysis.workbench.tab_title": "SQL-анализ",