1. Проектирование физической структуры баз данных для SQL Server 2008 — глубокий Дмитрий Артемов (dimaa@microsoft.com) Старший консультант, Microsoft Corp.
2. План Зачем вообще заниматься проектированием Физическая структура БД: как надо и что следует использовать Кластерные и некластерные индексы, фильтрованные индексы, секционирование и секционированные индексированные представления Недостающие индексы (DMV)и Database Tuning Advisor (DTA). Сравнение
3. Зачем вообще заниматься проектированием? Преимущества качественного дизайна БД Соответствует бизнес сценариям Обеспечивает высокую производительность на протяжении жизненного цикла приложения Облегчает масштабируемость и расширяемость приложения А что физическая структура? Производительность
4. Основы: Проектирование структуры БД На основе логической модели сторожится физическая Таблицы, ключи, индексы, секционирование, размещение файлов Уточнение физической модели С учетом требований производительности, доступности, разграничения доступа, аудита Реализация и тестирование физической модели
5. Физическая структура БД: как надо и что следует использовать Кластерные и некластерные индексы Нормализация и денормализация для производительности Возможности Разреженных столбцов Фильтрованных индексов Выровненные секционированные представления
6. Типы запросов Точечный запрос (критерий "="выбирает 1 запись) Множественный запрос (критерий "=" выбирает группу записей) Ранговый запрос (критерии BETWEEN или "<", ">") C использованием MIN/MAX С использованием Group By С использованием Order By Запрос с соединением (Join)
7. Кластерные и некластерные индексы Кластерный индекс Сбалансированное (B+) дерево, которое физически определяет порядок записей в таблиц Только 1 на таблицу Ширина ключа определяет глубину дерева – желательно минимальную (меньше операций вводаывода при обращении) Неявно влияет на некластерные индексы Особенно эффективен на ранговых запросах Всегда покрывающий Всегда уникальный "In a B+ tree, in contrast to a B-tree, all records are stored at the leaf level of the tree; only keys are stored in interior nodes." "If you don't enforce and guarantee uniqueness yourself, SQL Server will add a 4-byte "uniquefier" to each and every one of your rows"
8. Структура "кучи" и некластерного индекса index_id = 0 first_iam_page IAM Данные Данные Данные "Куча" (Heap)
9. Структура "кучи" и кластерного индекса index_id = 1 root_page Prev | NextИндекс Кластерный индекс Prev | NextИндекс Prev | NextИндекс Prev | NextИндекс Prev | Next Данные Prev | Next Данные Prev | Next Данные Prev | Next Данные
10. Когда хорош кластерный индекс (1) Когда запрос извлекает большое количество последовательных записей (ранговые запросы) Создавайте на часто используемых полях (d составе соединений с критериями "=", "<", ">", "BETWEEN") Если число возвращаемых записей мало, некластерный индекс тоже справится не хуже Лучше использовать на узких полях с высокой избирательностью
11. Когда хорош кластерный индекс (2) Для широких полей напр. nvarchar(50), можно использовать хеш значения (см.CHECKSUM): Требует перестроения запроса Не гарантирует уникальности, придется использовать дополнительный критерий Не все хешируется безупречно
12. Когда хорош кластерный индекс (3) Не забывайте о накладных расходах: Обновления реорганизуют таблицу Падение производительности Постепенная фрагментация индексов В определенный момент придется реорганизовывать или перестраивать индекс (это не всегда возможно online) Фоновые операции с индексами доступны только в выпусках SQL ServerEnterprise, Developer и Evaluation
13. Что такое некластерный индекс (1) Факты Повышение производительности за счет ускорения поиска Сбалансированное (B+) дерево, которое не влияет на организацию записей Можно создать Всего до 250 индексов на таблицу для SQL 2005 Всего до 1000 индексов на таблицу для SQL 2008 Состоит из пар (ключ, "указатель") Указатель: record ID (RID) или кластерный ключ Указатель стабилен для базовой таблицы
14. Структура некластерного индекса index_id > 1 root_page Некластерный индекс Prev | NextИндекс Prev | NextИндекс Prev | NextИндекс Prev | NextИндекс Prev | Next RID или кл. ключ, Included cols Prev | Next … Prev | Next … Prev | Next …
15. Поиск средствами некластерного индекса Поиск некластерного ключа Определение кластерного ключа Выборка записи Возврат результатов NCI: LastName CI: BusinessID Key(s) 4 Value(s) 1 3 1 Kim Adams 6 John Smith 11 Lewis Clark Adams 1 Clark 11 Smith 1 2
16. Что такое некластерный индекс (2) Некластерный индекс Может иметьincluded columns – полезно для "покрывающих" запросов Фактическое дублирование данных, но исключает поход в таблицу/кластерный индекс Не связан ограничением в 16 полей ключа или длины 900 байт на ключ
17. Поиск по некластерному индексус включенными полями CI: BusinessID 2 NCI: LastName InclFirstName Key(s) Value(s) 1 Kim Adams 6 Smith John 11 Lewis Clark Adams 1 Clark 11 Smith 1 1 Kim Lewis John
18. Некластерный индекс (1) Как правильно: Создавайте для полей, часто участвующих в поиске Используйте на узких полях с высокой избирательностью Используйте на foreign key constraints (ускорение запросов с соединениями) Проверьте возможность "покрытия" запросов Оцените возможность включения полей
19. Некластерный индекс (2) Недостаток: сопровождение Частые обновления при большом числе индексов вредят производительности Оцените преимущество [НЕ] индексирования маленьких таблиц
20.
21.
22. Фильтрованные индексы Полезны для Индексирования части таблицы Подмножество, например для поля с большой долей NULL Разнородные данные Секция очень большой таблицы Индексирования активной части данных
23. Фильтрованные индексы или представления Невозможно создать фильтрованный индекс на представлении Представления имеют более богатый функционал, но не всегда обеспечивают эффективный план <, >, =
24. Новое в SQL Server 2008:индексированные представления, выровненные по секциям Преимущества индексированных представлений Предрассчитанные и сохраненные агрегаты Материализованные соединения таблиц Комбинация вышеперечисленного Новое в SQL Server 2008: выровненные секционированные представления Больше не нужно пересоздавать представления после переключения секций Правила использования аналогичны правилам для индексов (см. http://msdn.microsoft.com/en-us/library/dd171921.aspx)
25. Инструменты SQL Server 2008 d помощь при проектировании БД Низкого уровня: Showplan Различные DMV: Использование индексов Недостающие индексы Высокого уровня: Database Engine Tuning Advisor
27. Недостающие индексы - DMV:мотивация Можем ли мы сделать то же самое для индексов? Да! Missing Idx DMVs
28. DTA при проектировании физической структуры БД Нагрузка Database Tuning Advisor SQL Server EQO расширяет возможности стандартного оптимизатора предоставляя "what-if" интерфейс оптимизации. Вызов к интерфейсу имитирует оптимизацию запроса, предполагая что имеется определенный индекс. What-If API Алгоритм поиска Extended Query Optimizer Рекомендации Внедрение
29. DTA Input и Output На вход БД для оптимизации Нагрузка (Profiler trace, T-SQL код) На выходе Рекомендации по созданию/удалению: Индексов (включая фильтрованные) Индексированных представлений Секционирования Статистики Ожидаемый % улучшений – оценка стоимости от оптимизатора Отчеты с рекомендациями
30. Функциональность DTA (1) Рекомендации по созданию/удалению: Индексов (включая фильтрованные) Индексированных представлений Секционирования Статистики Оптимизация с ограничением по времени Завершение оптимизации в отведенные сроки Ввод/Выводв формате XML Открытая схема: http://schemas.microsoft.com/sqlserver/2004/07/dta/dtaschema.xsd Возможность назначения весов элементам нагрузки Определяемая пользователем конфигурация Открывает возможности анализа"What-if" Позволяет указать специфику оптимизации
31. Функциональность DTA (2) Самостоятельное приложение Каждый "подход" – отдельная сессия Поддержка оптимизации в сценарии Тестовая/Промышленная среда Поддержка множественных БД Возможность сессии в режиме "Drop-only" Удаление неиспользуемых индексов, индексированных представлений Аналитические отчеты… Стоимость запросов, использование индексов, анализ нагрузки, … Рекомендует Индексы со включенными столбцами Операции с индексами в фоновом режиме
32. DTA , как правильно Входная нагрузка должна быть "представительной" Включать выборки и модификации Используйте шаблон Tuning для сбора данных средствами Profiler При оптимизации единственного запроса выбирайте настройку "Keep existing PDS" Используйте сценарий test/production для переноса нагрузки по оптимизации на тестовый сервер Используйте ограничение по времени для оптимизации в рамках "административного окна" Консольный вариант (DTA.Exe)позволяет автоматизировать процесс Usage: DTA.EXE [-S ServerName[nstance]] [-U LoginId] [-P Password] [-E] [-d DatabaseName] [-D DatabaseName[, DatabaseName]] [-Tl TableName[, TableName]] [-Tf TableListFileName] [-if WorkloadFileName] [-it WorkloadTableName] [-s SessionName] [-of [ScriptFileName]] [-or [ReportFileName]] [-rl Report[, Report]] [-ox [OutputXmlFileName]] [-F] [-ID SessionID] [-ix InputXmlFileName] [-A TuningTime] [-n NumberOfEvents] [-m MinimumImprovement] [-fa PhysicalDesignStructure] [-fp PartitionStrategy] [-fk PhysicalDesignStructure] [-fx] [-fi] [-B StorageSize] [-c MaxKeyColumnsInIndex] [-C MaxColumnsInIndex] [-e TuningLogTable] [-N OnlineOption] [-q] [-u] [-x] [-a] [-?]
34. Это важно DTA и Missing Indexes могут отличаться в своих рекомендациях Даже при анализе единственного запроса Кого использовать? Используйте "missing indexes"для быстрого анализа необходимых индексов Проверьте средствами DTA Используйте DTA если Нужен подробный анализ Важен учет операций обновления и объемов Нужно рассмотреть индексированные представления и секционирование Проверяйте рекомендации от обоих инструментов
35. В заключение Не пускайте физическую реализацию БД на самотек Проблемы проектирования (создание/удаление индексов, представлений) отзываются падением производительности Используйте имеющиеся инструменты: Showplan DMV с анализом индексов Missing index DMV– для индивидуальных запросов DTA – для анализа нагрузки Проверяйте рекомендации в тестовой среде