Пример разработки высоконагруженной реляционной базы данных Белоусов Павел
Краткое содержанние Постановка задачи Проблемы Решение проблем
Наша задача ОБД РБД
А зачем? Поиск по связанным объектам Проверка целостности
Task-Based система Отмечаются изменения в ОБД На основе изменений создаются задачи Задачи обрабатываются Данные синхронизируются в РБД
Поиск по иерархическим данным Создали схему Создали индексы Проверили, что всё работает быстро Сдали в продакшн
Прошел год...
Проблемы Запросы на поиск выполняются по несколько минут Данные синхронизируются с большой задержкой Ребилд индексов работает по 12 часов
Нагрузка Было 1-2 M задач ~10 потоков ~10сек на поиск 1 мин на репликацию Стало 50+ M задач 25 потоков 3+ мин на поиск 1+ час на репликацию
Оптимизация запросов Денормализация Настройка индексов Рефакторинг запросов
Денормализация Name: ParentNode Name: Node AName: Node B Type: A Type: B
Настройка индексов SQL Server Profiler Execution Plan Index Tuning Advisor Index Tuning
Рефакторинг запросов Все ли поля из запроса нужны Все ли JOINы нужны Используйте Full Text Search вместо LIKE Пересмотрите работу с временными таблицами Попробуйте разбить запрос
Запросы на поиск Было 3 мин Стало < 30 сек
Переработка системы задач Рефакторинг схемы Рефакторинг алгоритма Устранение блокировок
Рефакторинг схемы
Рефакторинг алгоритма Использование грязного чтения Группировка задач Отказ от TABLOCKов
Группировка задач Node A – Data 1 Node A – Data 2 Node A – Data 3 … Node A – Data N
Устранение блокировок Научились воспроизводить deadlockи Определили конфликтующие запросы Переписали запросы
Устранение блокировок
Что получилось? Часть данных реплицируется за 1 минуту Не критичные – за час
Не оставляйте технических долгов
Следите за производительностью
Изучайте матчасть Индексы Уровни изоляции Блокировки и взаимные блокировки Планы выполнения
Спасибо за внимание Белоусов Павел