Создать сайт на Satu.kz
Корзина
22 отзыва
promo_banner
ВСЁ PRO СЕРВЕРЫ
Контакты
Serverparts ТООАрнур
ул. Толе Би 286/2, оф. 206, Алматы, Казахстан
+7 (700) 760-60-52
отдел продаж
@server_parts+7776 760 6052
  • ВКонтактеvk.com/sp_server_parts
Карта
+7 (700) 760-60-52

Полная оптимизация SQL Server: от настройки с нуля до переноса баз на SSD-массивы

Полная оптимизация SQL Server: от настройки с нуля до переноса баз на SSD-массивы

СОДЕРЖАНИЕ:
1. Оптимизация SQL-запросов
2. Настройка сервера с нуля
3. Конфигурация новой базы данных
4. Перенастройка действующей базы
5. Распределение по RAID-массивам
6.Стратегия размещения на SSD
7. Правила настройки дисков и ОС
8. Перенос существующих баз
9. Версии SQL Server: память и объёмы

 

1. Оптимизация SQL-запросов:

По данным практики большинства DBA, до 70–80% проблем производительности решаются оптимизацией запросов и индексов - ещё до настройки железа или конфигурации сервера.

Индексы
Правильно спроектированные индексы - единственный наиболее эффективный инструмент оптимизации
 
Планы выполнения
Анализ Actual Execution Plan выявляет неэффективные операции быстрее любых метрик
 
Статистика
Устаревшая статистика ведёт к плохим планам даже при хорошей схеме индексов
 
Покрывающие индексы
INCLUDE-колонки
устраняют Key Lookup и снижают нагрузку на I/О

Ключевые правила написания запросов -  избегайте SELECT *, функций над индексируемыми столбцами в WHERE, неявных преобразований типов и курсоров там, где достаточно одного set-based запроса.

Антипаттерн Проблема  Решение
WHERE YEAR(date) = 2024 Функция блокирует использование индекса WHERE date >= '2024-01-01' AND date < '2025-01-01'
SELECT * FROM Orders Лишние столбцы - лишний I/O Перечислить только нужные столбцы
LIKE '%text%' Full scan, индекс игнорируется Full-Text Search или начальный LIKE 'text%'
N+1 запросы (курсоры) Тысячи round-trip к серверу JOIN или одна процедура с temp table
Неявное приведение типов Implicit convert - scan вместо seek Явное CAST/CONVERT или приведение схемы
Нет покрывающего индекса Key Lookup = +1 операция на строку INCLUDE нужных столбцов в индекс
Игнорирование Query Feedback SQL 2022 умеет сам корректировать планы Включите AUTOMATIC_TUNING с режимом FORCE_LAST_GOOD_PLAN

Совет: Системное представление sys.dm_db_missing_index_details покажет, какие индексы SQL Server рекомендует создать.

Однако не создавайте их слепо: СУБД предлагает их под конкретный запрос, не анализируя общую картину. Избыток индексов серьезно замедлит операции INSERT/UPDATE/DELETE».

Но не создавайте все подряд: каждый лишний индекс замедляет INSERT, UPDATE и DELETE - особенно на нагруженных таблицах.

SQL Server 2022+: Intelligent Query Processing (IQP) автоматически исправляет ряд антипаттернов - Parameter Sensitive Plan Optimization (PSPO) создаёт несколько планов для одного запроса с разными диапазонами параметров. Включается через Compatibility Level 160.

 

2. Настройка сервера с нуля:

Первоначальная установка и конфигурация закладывает фундамент производительности на годы вперёд. Исправлять плохие настройки на работающем production - значительно дороже.

1

 

Установка и выбор коллации
Для русскоязычных баз - Cyrillic_General_CI_AS или Russian_CI_AS. Смена коллации после создания базы потребует пересоздания всех объектов.
 
2
Ограничение оперативной памяти (max server memory)
Оставьте ОС 10–15% RAM или минимум 4 ГБ. Без ограничения SQL Server захватывает всю память, и ОС начинает свопить.
3
Настройка MAXDOP и Cost Threshold

MAXDOP: для серверов с ≤8 ядрами на NUMA-узел - равен числу ядер. При >8 ядрах - половина ядер на узел, но не более 8. Для гиперпоточности (HT) считайте только физические ядра

 
4
Предварительное выделение файлов
Включите Instant File Initialization для .mdf/.ndf. Включите Locked Pages in Memory (LPIM) для серверов с >32 ГБ RAM.
5
TempDB: один файл на ядро
Создайте несколько файлов TempDB (обычно 4–8, не более числа ядер) одинакового размера на отдельном быстром диске.
 
6
Query Store

SQL 2016+, в SQL 2022 Query Store включён по умолчанию для новых баз и поддерживает режим Read Replicas в рамках Always On AG 

7
Accelerated Database Recovery (ADR)

Начиная с SQL 2019, ADR включается на уровне базы данных:

ALTER DATABASE [ProductionDB] SET ACCELERATED_DATABASE_RECOVERY = ON;

Ускоряет откат транзакций в десятки раз, сокращает размер версий транзакций в TempDB при длинных транзакциях. Рекомендуется включать на всех PROD-базах.

 
 
 

Внимание: TempDB


TempDB пересоздаётся при каждом перезапуске. Все настройки размера файлов TempDB нужно прописывать в конфигурации, а не задавать вручную после старта.

3. Конфигурация новой базы данных:

При создании новой базы закладывайте правильные параметры сразу - это экономит часы работы в будущем при росте объёма данных.

Параметр
Рекомендация
Обоснование
Начальный размер .mdf Заложить 120–150% от ожидаемого объёма за 6 мес Исключает Autogrowth в рабочее время
Autogrowth (.mdf) Фиксированный прирост, не %; например 1–4 ГБ % прирост на больших базах создаёт огромные операции
Начальный размер .ldf 25–30% от размера .mdf

Снижает частоту VLF-фрагментации

VLF-фрагментации (Virtual Log Files - внутренние сегменты журнала; их избыток замедляет восстановление и backup журнала).

Recovery Model FULL для PROD, SIMPLE для DEV/QA FULL обязателен для log shipping и резервных копий журнала
Page Verify CHECKSUM Обнаружение повреждений данных на диске
Auto Close OFF Auto Close сбрасывает кеш буферного пула
Auto Shrink OFF Shrink фрагментирует данные и нагружает I/O
Compatibility Level

Compatibility Level: 

SQL Server 2019 - 150 

SQL Server 2022 - 160

SQL Server 2025 - 170 (Preview)

Пример кода: 

ALTER DATABASE [ProductionDB] SET ACCELERATED_DATABASE_RECOVERY = ON;

ALTER DATABASE [ProductionDB] SET COMPATIBILITY_LEVEL = 160; -- для SQL 2022

Новые оптимизаторные фичи доступны только при высоком уровне совместимости. 

Устанавливать максимальный для текущей версии SQL - но только после тестирования в staging: повышение уровня совместимости меняет поведение оптимизатора и может изменить планы выполнения существующих запросов.

Пример создания базы с правильными параметрами:

CREATE DATABASE [ProductionDB] ON PRIMARY ( NAME = N'ProductionDB', FILENAME = N'E:\SQLData\ProductionDB.mdf', SIZE = 10240MB, -- 10 ГБ начальный размер FILEGROWTH = 1024MB -- прирост 1 ГБ (не %) ) LOG ON ( NAME = N'ProductionDB_log', FILENAME = N'F:\SQLLog\ProductionDB_log.ldf', SIZE = 2048MB, FILEGROWTH = 512MB );

ALTER DATABASE [ProductionDB] SET RECOVERY FULL; ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM; ALTER DATABASE [ProductionDB] SET AUTO_CLOSE OFF; ALTER DATABASE [ProductionDB] SET AUTO_SHRINK OFF; ALTER DATABASE [ProductionDB] SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE, MAX_STORAGE_SIZE_MB = 1024);

4. Перенастройка действующей базы:

На production-системе изменения вносятся поэтапно, с мониторингом. Некоторые операции требуют кратковременного обслуживания (maintenance window).

Критически важно! Перед любыми изменениями на действующей базе - полная резервная копия. Изменение коллации или recovery model может потребовать пересоздания объектов или прерывания журнальных цепочек.

Задача  Действие Риск Окно
Обновить статистику UPDATE STATISTICS WITH FULLSCAN Низкий Онлайн

Реорганизация индексов

ALTER INDEX ... REORGANIZE Низкий Онлайн
Перестройка индексов ALTER INDEX ... REBUILD (ONLINE=ON) Средний Онлайн (Enterprise)
Включить Query Store ALTER DATABASE ... SET QUERY_STORE = ON Низкий Онлайн
Изменить Recovery Model ALTER DATABASE ... SET RECOVERY Средний Обслуживание
Изменить Compatibility Level ALTER DATABASE ... SET COMPATIBILITY_LEVEL Средний Тест в staging
Дефрагментация данных DBCC INDEXDEFRAG / REORGANIZE Низкий Онлайн

 

5. Распределение по RAID-массивам:

Дисковая подсистема - исторически главное узкое место SQL Server. Правильное использование RAID радикально меняет производительность операций чтения/записи.

RAID 1
Зеркалирование. Подходит для журналов транзакций (.ldf). Высокая надёжность, запись без оверхеда.
 
RAID 10
Страйпинг + зеркало. Лучший выбор для .mdf и TempDB. Высокое чтение и запись, отказоустойчивость.
 
RAID 5

Чётность. Приемлем для архивных данных и резервных копий. RAID 5 - из-за необходимости пересчёта чётности (parity write penalty) каждая запись требует 4 операций вместо 1. Категорически не подходит для журналов транзакций и TempDB.

Тип файла Рекомендуемый RAID Причина
Данные (.mdf/.ndf) RAID 10 Сбалансированная R/W нагрузка, нужна отказоустойчивость
Журнал транзакций (.ldf) RAID 1 или RAID 10 Последовательная запись, критичная надёжность
TempDB RAID 10 (или отдельные SSD) Высокая случайная R/W, восстановление не нужно
Резервные копии RAID 5 или RAID 6 Преимущественно последовательная запись, нужно много места
ОС и бинарные файлы SQL RAID 1 Минимальная нагрузка, надёжность важнее скорости

Stripe Size (размер полосы)

Для OLTP-нагрузок рекомендуется stripe size 64 КБ - совпадает с размером страниц SQL Server. Для DWH/аналитики можно увеличить до 256 КБ для лучшей последовательной производительности. Размер stripe задаётся при создании массива в контроллере (RAID-карте) или при инициализации дискового пула. После создания массива изменить без пересоздания невозможно.

В SQL Server 2022 на NVMe-массивах с поддержкой Storage Class Memory (SCM/Optane) размер полосы менее критичен — драйвер работает в байт-адресуемом режиме. Для стандартных SSD RAID рекомендация 64 КБ остаётся актуальной.

6. Стратегия размещения на SSD:

Правильное разнесение компонентов базы данных (на примере MS SQL Server, PostgreSQL или MySQL) по разным SSD-накопителям позволяет минимизировать конкуренцию за ввод-вывод (I/O) и изолировать разные типы нагрузки.

Характер нагрузки на базы данных делится на три типа: случайное чтение/запись (файлы данных), строго последовательная запись (журналы транзакций) и интенсивная временная нагрузка (TempDB / tmpdir).

Подготовка накопителей: 

1. Перед распределением файлов обязательно отформатируйте SSD под нужды СУБД.

2. Размер кластера (файловая система): Для дисков с базами данных, логами и TempDB всегда выбирайте размер кластера 64 КБ вместо стандартных 4 КБ. Это оптимизирует скорость чтения-записи для крупных блоков данных СУБД.

Вариант 1: У вас есть 2 SSD

  • SSD 1: Операционная система, сам движок SQL, Журнал транзакций (.ldf / WAL) и база TempDB.
  • SSD 2: Основные файлы данных (.mdf / .ndf).
  • Файлы данных генерируют случайный ввод-вывод. Если посадить их на один диск с логами (последовательная запись), общая скорость упадет из-за смешивания паттернов нагрузки
  •  

Вариант 2: У вас есть 3 SSD (Оптимальный баланс)

  • SSD 1: ОС, файлы СУБД + Журнал транзакций (.ldf / WAL).
  • SSD 2: Основные файлы данных (.mdf).
  • SSD 3: Временная база данных TempDB (или tmpdir для MySQL/PostgreSQL).
  • TempDB используется для тяжелых сортировок, промежуточных вычислений и соединений (особенно актуально для 1С). Выделение под нее отдельного SSD убирает нагрузку с основных баз. 
  •  

 Вариант 3: У вас есть 4 и более SSD (Максимальная производительность)

  • SSD 1: Операционная система и файлы развертывания СУБД.
  • SSD 2: Только журналы транзакций (максимально быстрый SSD на запись).
  • SSD 3: Файлы данных (высокая скорость случайного чтения).
  • SSD 4: Выделенный диск под TempDB.
Кол-во SSD: Рекомендуемая схема:
2 SSD SSD1: ОС + журнал (.ldf) + TempDB. SSD2: Данные (.mdf). Изолируем случайный I/O от последовательного
3 SSD SSD1: ОС + журнал (.ldf). SSD2: Данные (.mdf). SSD3: TempDB + Backup
4 SSD SSD1: ОС. SSD2: Данные (.mdf). SSD3: Журнал (.ldf). SSD4: TempDB
6+ SSD

Data: 2–4 диска в RAID 10. Журнал: 2 диска в RAID 1. TempDB: 1–2 диска. ОС/Backup: отдельно

 

NVMe vs SATA SSD: NVMe даёт в 3–5× более высокий случайный IOPS по сравнению с SATA SSD. Размещайте на NVMe: данные (.mdf) и TempDB. Журнал транзакций (.ldf) - последовательная запись, SATA SSD справляется хорошо.

Архитектурные хитрости для крупных БД:

Если у вас одна огромная база данных, которая не помещается на один быстрый SSD, используйте внутренние механизмы СУБД:

  • Начать стоит с создания вторичной файловой группы: ALTER DATABASE [db] ADD FILEGROUP [FG_Archive], затем перенести в неё старые таблицы. Это не требует изменения кода приложения.
  • Файловые группы (Filegroups): Разделите одну базу данных на несколько файлов данных и распределите их по разным SSD. SQL Server умеет писать в них параллельно (метод Round-Robin), увеличивая общую скорость. 
  • Секционирование таблиц (Partitioning): Перенесите «горячие» данные (например, документы за текущий год) на самый быстрый NVMe SSD, а «холодные» архивные таблицы (прошлые года) — на более дешевый и емкий SATA SSD или HDD.
  • Разделение TempDB на файлы: Создайте несколько файлов данных для TempDB (обычно по числу ядер процессора, но не более 8). Разместите их строго на одном выделенном SSD, чтобы СУБД параллельно обрабатывала временные таблицы.
  • SQL Server 2022: S3-совместимое хранилище для резервных копий: теперь можно делать BACKUP TO URL напрямую на S3-совместимые хранилища (MinIO, Wasabi и др.), не только Azure Blob.

Запрещено: 

  • Не используйте RAID 5/6 для журналов транзакций. Эти массивы имеют низкую скорость записи из-за просчета контрольных сумм (Parity Write Penalty). Для логов лучше использовать RAID 10 или одиночный быстрый NVMe.
  • Не оставляйте TempDB на диске C:. Если база временных таблиц разрастется и забьет диск целиком, операционная система «упадет» или намертво зависнет.
  • Не смешивайте бэкапы с рабочими базами. Файлы бэкапов должны складываться на физически другие накопители (лучше всего на сетевое хранилище NAS или емкие HDD). Если SSD с базой выйдет из строя, вы потеряете и базу, и бэкапы.

7. Правила настройки дисков и ОС:

Настройка Параметр Значение
Размер кластера NTFS Allocation unit size 64 КБ (для томов с данными SQL)
Power Plan (Windows) Схема электропитания High Performance -ОБЯЗАТЕЛЬНО
Кеш записи диска Write Cache / Write-Back Включён с battery-backed кешем контроллера
Дефрагментация Scheduled Defragmentation Отключить для SSD-томов
TRIM fsutil behavior set DisableDeleteNotify 0 (TRIM включён для SSD)
Prefetch / Superfetch SysMain service Отключить на выделенном SQL-сервере
Windows Defender Исключения Добавить пути к .mdf, .ldf, .bak из сканирования в реальном времени
NUMA Numa Node Balancing SQL Server автоматически привязывает потоки к NUMA-узлам
Huge Pages (Linux) Transparent HugePages Отключить (madvise) для SQL Server on Linux
Частая ошибка! Размер кластера по умолчанию в Windows - 4 КБ. SQL Server работает со страницами 8 КБ, что означает разбиение каждой страницы на несколько кластеров. При 64 КБ достигается оптимальное выравнивание.

8. Перенос существующих баз:

Перенос на новые диски или серверы требует тщательного планирования. Ниже основные методы с указанием сценариев применения.

Метод Простой Подходит для Сложность
Backup / Restore Да (время резервной копии) Любой перенос, в т.ч. на другой сервер Низкая
Detach / Attach Да (время детача) Перенос в рамках одного экземпляра или совместимых версий Низкая
Перемещение файлов (ALTER DATABASE) Краткосрочный Перемещение файлов .mdf/.ldf на другой диск Средняя
Log Shipping / Mirroring Минимальный Перенос без остановки или с HA. Работает на Standard Edition Средняя
Always On AG Нулевой Крупные PROD-системы, требующие RTO ≈ 0. Только Enterprise, нужен WSFC Очень высокая
1
Полная резервная копия 
перед любым переносом. Убедитесь, что backup завершился без ошибок.
 
2
Перевод базы в OFFLINE (для Detach/Attach) 
или переключение приложений на время Restore.
3
Перенос или восстановление
файлов на новые диски. Проверьте права доступа для учётной записи службы SQL Server.
 
4
Проверка целостности 
DBCC CHECKDB сразу после переноса. Исправить ошибки на этом этапе значительно проще.
5
Обновление путей 
в заданиях Agent, скриптах бэкапа, мониторинге. Не забудьте про TempDB - пути прописываются в конфигурации.
 
6
Мониторинг производительности
первые 24–72 часа после переноса. Wait stats, I/O latency, plan cache.
Перемещение файлов базы на новые диски (без Detach) USE master;

1. Обновить пути в метаданных:

ALTER DATABASE [ProductionDB] MODIFY FILE (NAME = N'ProductionDB', FILENAME = N'E:\SQLData\ProductionDB.mdf'); ALTER DATABASE [ProductionDB] MODIFY FILE (NAME = N'ProductionDB_log', FILENAME = N'F:\SQLLog\ProductionDB_log.ldf');

2. Перевести базу в offline:

ALTER DATABASE [ProductionDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;

3. Скопировать файлы вручную (xcopy / robocopy)

4. Перевести базу обратно в online:

ALTER DATABASE [ProductionDB] SET ONLINE;

5. Проверить целостность:

DBCC CHECKDB ([ProductionDB]) WITH NO_INFOMSGS;

 

9. Версии SQL Server: память и объёмы:

Лимиты памяти и возможности конфигурирования существенно различаются в зависимости от версии и редакции SQL Server. Выберите версию ниже для детального сравнения.

Редакция  SQL 2019 SQL 2022 SQL 2025 (Preview)
Enterprise RAM Неограничена (ОС) Неограничена (ОС) Неограничена (ОС)
Standard RAM 128 ГБ  128 ГБ  256 ГБ 
Express RAM 1,4 ГБ 1,4 ГБ 1,4 ГБ
Standard CPU 4 сокета или 24 ядра (меньшее из двух) 4 сокета или 24 ядра (меньшее из двух) 32 ядра 
Макс. БД 524 ПБ / 10 ГБ Express 524 ПБ / 10 ГБ Express 524 ПБ / 50 ГБ Express

SQL - 2017 ; SQL - 2019; SQL - 2022; SQL - 2025

Версия Главное отличие от предыдущей
2017 Linux-поддержка, Python, адаптивные планы
2019 Intelligent Query Processing (IQP), ADR - восстановление за секунды вместо минут
2022 IQP v2, Contained AG, Azure Arc, Ledger Tables
2025 Vector Search / AI, JSON-индексы, Standard 256 ГБ / 32 ядра, Express 50 ГБ, Fabric Mirroring

SQL Server 2016 - End of Life с июля 2026. Поддержка полностью прекращена.

SQL Server 2017 — расширенная поддержка завершается октябрь 2027.

SQL Server 2019 — расширенная поддержка до января 2030.

SQL Server 2022 — основная поддержка до января 2027, расширенная до января 2032.

Целевые версии для миграции: 2022 (стабильная, проверенная в production) или 2025 (GA с ноября 2025, AI-ready).

256 ГБ
RAM для Standard Edition
524 ПБ
Макс. размер БД (Enterprise)
50 ГБ

Макс. размер БД Express

4
Ядра CPU для Express

Чеклист приоритетов:

✓ Выделите данные, журналы и TempDB на разные диски/RAID
✓ Форматируйте NTFS с allocation unit 64 КБ
✓ Ограничьте max server memory, настройте MAXDOP
✓ Включите Query Store и следите за регрессиями планов
✓ Предварительно выделите файлы баз нужного размера
✓ Никогда не включайте Auto Shrink в production 
✓ Регулярно обслуживайте индексы (Rebuild / Reorganize)
Планируйте переход на SQL Server 2019 / 2022

Включите ADR (Accelerated Database Recovery) на PROD-базах
Установите Compatibility Level 160 (SQL 2022) для IQP-оптимизаций

Распределяйте данные по типу накопителя для баланса производительности и стоимости:

  • NVMe SSD - файлы баз данных (.mdf, .ndf) и TempDB: максимальный IOPS для горячих данных
  • SATA SSD - журналы транзакций (.ldf) и ОС с приложениями: последовательная запись, высокая надёжность
  • SATA SSD или HDD - кеш, вторичные и редко используемые данные
  • HDD - резервные копии (.bak) и файловые архивы: большой объём по минимальной цене

 

Другие статьи