физическая структура хранения артемов ready
DESCRIPTION
TRANSCRIPT
Проектирование физической структуры баз данных для SQL Server 2008 — глубокий
Дмитрий Артемов ([email protected]) Старший консультант, Microsoft Corp.
План• Зачем вообще заниматься проектированием
• Физическая структура БД: как надо и что следует использовать– Кластерные и некластерные индексы, фильтрованные
индексы, секционирование и секционированные индексированные представления
• Недостающие индексы (DMV) и Database Tuning Advisor (DTA). Сравнение
Зачем вообще заниматься проектированием?
• Преимущества качественного дизайна БД– Соответствует бизнес сценариям– Обеспечивает высокую производительность на
протяжении жизненного цикла приложения– Облегчает масштабируемость и расширяемость
приложения• А что физическая структура?– Производительность
Основы: Проектирование структуры БД
• На основе логической модели сторожится физическая– Таблицы, ключи, индексы, секционирование,
размещение файлов• Уточнение физической модели– С учетом требований производительности,
доступности, разграничения доступа, аудита• Реализация и тестирование физической модели
Физическая структура БД: как надо и что следует использовать
• Кластерные и некластерные индексы• Нормализация и денормализация для
производительности• Возможности– Разреженных столбцов– Фильтрованных индексов– Выровненные секционированные
представления
Типы запросов• Точечный запрос (критерий "="
выбирает 1 запись)• Множественный запрос
(критерий "=" выбирает группу записей)
• Ранговый запрос (критерии BETWEEN или "<", ">")
• C использованием MIN/MAX• С использованием Group By• С использованием Order By• Запрос с соединением (Join)
Кластерные и некластерные индексы• Кластерный индекс– Сбалансированное (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"
Структура "кучи" и некластерного индекса
• "Куча" (Heap) IAM
index_id = 0 first_iam_page
Данные Данные Данные
Структура "кучи" и кластерного индекса
• Кластерный индекс Prev | Next
Индекс
index_id = 1 root_page
Prev | Next
Данные
Prev | Next
Индекс
Prev | Next
Индекс
Prev | Next
Индекс
Prev | Next
Данные
Prev | Next
Данные
Prev | Next
Данные
Когда хорош кластерный индекс (1)
• Когда запрос извлекает большое количество последовательных записей (ранговые запросы)– Создавайте на часто используемых полях (d составе
соединений с критериями "=", "<", ">", "BETWEEN")– Если число возвращаемых записей мало,
некластерный индекс тоже справится не хуже– Лучше использовать на узких полях с высокой
избирательностью
Когда хорош кластерный индекс (2)
• Для широких полей напр. nvarchar(50), можно использовать хеш значения (см. CHECKSUM):
• Требует перестроения запроса
• Не гарантирует уникальности, придется использовать дополнительный критерий
• Не все хешируется безупречно
Когда хорош кластерный индекс (3)
• Не забывайте о накладных расходах:– Обновления реорганизуют таблицу• Падение производительности• Постепенная фрагментация индексов• В определенный момент придется
реорганизовывать или перестраивать индекс (это не всегда возможно online)
Фоновые операции с индексами доступны только в выпусках SQL Server Enterprise, Developer и Evaluation
Что такое некластерный индекс (1)• Факты
– Повышение производительности за счет ускорения поиска– Сбалансированное (B+) дерево, которое не влияет на
организацию записей– Можно создать
• Всего до 250 индексов на таблицу для SQL 2005• Всего до 1000 индексов на таблицу для SQL 2008
– Состоит из пар (ключ, "указатель")– Указатель: record ID (RID) или кластерный ключ– Указатель стабилен для базовой таблицы
Структура некластерного индекса
• Некластерный индекс Prev | Next
Индекс
index_id > 1 root_page
Prev | Next
RID или кл. ключ,
Included cols
Prev | Next
Индекс
Prev | Next
Индекс
Prev | Next
Индекс
Prev | Next
…
Prev | Next
…
Prev | Next
…
Поиск средствами некластерного индекса
CI: BusinessI
D
1 Kim Adams
6 John Smith
11 Lewis Clark
Key(s)
Value(s)
Adams 1
Clark 11
Smith 1
1
NCI: LastName
23
4
1. Поиск некластерного ключа
2. Определение кластерного ключа
3. Выборка записи4. Возврат
результатов
Что такое некластерный индекс (2)
• Некластерный индекс– Может иметь included columns – полезно для
"покрывающих" запросов• Фактическое дублирование данных, но исключает
поход в таблицу/кластерный индекс• Не связан ограничением в 16 полей ключа или
длины 900 байт на ключ
Поиск по некластерному индексус включенными полями
CI: BusinessI
D
1 Kim Adams
6 Smith John
11 Lewis Clark
Key(s) Value(s)
Adams 1
Clark 11
Smith 1
Kim
Lewis
John
NCI: LastName
1
2
Incl FirstName
Некластерный индекс (1)• Как правильно:– Создавайте для полей, часто участвующих в
поиске– Используйте на узких полях с высокой
избирательностью– Используйте на foreign key constraints (ускорение
запросов с соединениями)– Проверьте возможность "покрытия" запросов
• Оцените возможность включения полей
Некластерный индекс (2)
• Недостаток: сопровождение– Частые обновления при большом числе
индексов вредят производительности• Оцените преимущество [НЕ]
индексирования маленьких таблиц
DMV оценки работы индексов• Позволяют оценить полезность и качество работы индексов
– sys.dm_db_index_usage_stats DMV– sys.dm_db_index_physical_stats()– sys.dm_db_index_operational_stats()
• Как ими пользоваться– Большое число поисков (user seek) для кластерного индекса– Число обращений (user lookup) также велико– Число поисков для некластерного индекса также очень великоОцените возможность кластеризации некластерного индексаОцените наличие покрывающих запросов и включения полей в
некластерный индекс
Новое в SQL Server 2008: фильтрованные индексы
• Некластерный индекс с фильтром
• Преимущества– Более дешевое сопровождение и меньшие размеры– Потенциальное улучшение плана (более точная
статистика на меньшем диапазоне данных)
Фильтрованные индексы• Полезны для–Индексирования части таблицы• Подмножество, например для поля с
большой долей NULL• Разнородные данные• Секция очень большой таблицы
–Индексирования активной части данных
Фильтрованные индексы или представления
• Невозможно создать фильтрованный индекс на представлении• Представления имеют более богатый функционал, но не всегда обеспечивают
эффективный план
Используются в выражениях Представления Фильтрованные индексы
Вычисляемые поля
Соединения
Несколько таблиц
Простая логика сравнения в условиях
Сложная логика сравнения в условиях
<, >, =
Новое в SQL Server 2008:индексированные представления, выровненные по секциям
• Преимущества индексированных представлений– Предрассчитанные и сохраненные агрегаты– Материализованные соединения таблиц– Комбинация вышеперечисленного
• Новое в SQL Server 2008: выровненные секционированные представления– Больше не нужно пересоздавать представления после
переключения секций– Правила использования аналогичны правилам для индексов
(см. http://msdn.microsoft.com/en-us/library/dd171921.aspx)
Инструменты SQL Server 2008 d помощь при проектировании БД
• Низкого уровня:– Showplan– Различные DMV:• Использование индексов• Недостающие индексы
• Высокого уровня: Database Engine Tuning Advisor
Недостающие индексы и DTA• Мотивация• Некоторые детали реализации• Различия и сходство
Недостающие индексы - DMV:мотивация
Можем ли мы сделать то же самое для индексов?
Да!Missing Idx
DMVs
DTA при проектировании физической структуры БД
SQL ServerWhat-If API
Database Tuning Advisor
ExtendedQuery
Optimizer
Внедрение
Нагрузка
Рекомендации
Алгоритмпоиска
EQO расширяет возможности стандартного оптимизатора предоставляя "what-if" интерфейс оптимизации. Вызов к интерфейсу имитирует оптимизацию запроса, предполагая что имеется определенный индекс.
DTA Input и Output• На вход– БД для оптимизации– Нагрузка (Profiler trace, T-SQL код)
• На выходе– Рекомендации по созданию/удалению:
• Индексов (включая фильтрованные)• Индексированных представлений• Секционирования• Статистики
– Ожидаемый % улучшений – оценка стоимости от оптимизатора
– Отчеты с рекомендациями
Функциональность DTA (1)• Рекомендации по созданию/удалению:
– Индексов (включая фильтрованные)– Индексированных представлений– Секционирования– Статистики
• Оптимизация с ограничением по времени– Завершение оптимизации в отведенные сроки
• Ввод/Вывод в формате XML– Открытая схема:
http://schemas.microsoft.com/sqlserver/2004/07/dta/dtaschema.xsd– Возможность назначения весов элементам нагрузки
• Определяемая пользователем конфигурация– Открывает возможности анализа "What-if"– Позволяет указать специфику оптимизации
Функциональность DTA (2)• Самостоятельное приложение
– Каждый "подход" – отдельная сессия
• Поддержка оптимизации в сценарии Тестовая/Промышленная среда
• Поддержка множественных БД• Возможность сессии в режиме "Drop-only"
– Удаление неиспользуемых индексов, индексированных представлений
• Аналитические отчеты…– Стоимость запросов, использование индексов, анализ нагрузки, …
• Рекомендует– Индексы со включенными столбцами– Операции с индексами в фоновом режиме
DTA , как правильно• Входная нагрузка должна быть "представительной"
– Включать выборки и модификации– Используйте шаблон Tuning для сбора данных средствами Profiler
• При оптимизации единственного запроса выбирайте настройку "Keep existing PDS"
• Используйте сценарий test/production для переноса нагрузки по оптимизации на тестовый сервер
• Используйте ограничение по времени для оптимизации в рамках "административного окна"
• Консольный вариант (DTA.Exe) позволяет автоматизировать процесс
Usage:DTA.EXE [-S ServerName[\Instance]] [-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] [-?]
Сравнение с функционалом "missing indexes"Функционал DTA "Missing Indexes"
Применимость Клиентское приложение; используется администратором БД, подробный анализ нагрузки
Серверный функционал; всегда активно; быстрый анализ (для снижения накладных расходов)
UPDATE, INSERT, DELETE учитываются при анализе
Да Нет
Ограничения по размерам учитываются при анализе
Да Нет
Порядок полей в ключе индекса Автоматически определяется по оценке стоимости
Определяется пользователем
Может рекомендовать кластерный индекс Да Нет
Может рекомендовать индексированные представления
Да Нет
Может рекомендовать секционирование Да Нет
На чем основаны рекомендации Стоимость исполнения, определенная оптимизатором
Аппроксимация стоимости исполнения, определенной оптимизатором
Отчет о результатах анализа (эффект от внедрения изменений)
Да (15 отчетов) Примерная оценка от внедрения индекса
Это важно• DTA и Missing Indexes могут отличаться в своих рекомендациях
– Даже при анализе единственного запроса• Кого использовать?
– Используйте "missing indexes" для быстрого анализа необходимых индексов• Проверьте средствами DTA
– Используйте DTA если• Нужен подробный анализ• Важен учет операций обновления и объемов • Нужно рассмотреть индексированные представления и секционирование
• Проверяйте рекомендации от обоих инструментов
В заключение• Не пускайте физическую реализацию БД на самотек
– Проблемы проектирования (создание/удаление индексов, представлений) отзываются падением производительности
• Используйте имеющиеся инструменты:– Showplan– DMV с анализом индексов– Missing index DMV – для индивидуальных запросов– DTA – для анализа нагрузки
• Проверяйте рекомендации в тестовой среде
Спасибо