Правда о fill-factor в MS SQL Server
Страница 2. Загадка


 

Загадка

Начинаясь с SQL Server 7.0, автор часто встречал такой вопрос: "Каково реальное различие между fill factor = "0" и fill factor = "100"?". Хотя SQL Server 2000 и 7.0 Books Online (BOL) сообщают, что fill factor = "100" означает, что все уровни индекса будут заполнены, много людей, очевидно, не думают, что это правда. Для исследования такого различия, автор использовал две недокументированные команды DBCC: DBCC IND и DBCC PAGE. Эти команды не перечислены в BOL, и Микрософт официально не поддерживает их, хотя статьи Микрософт иногда упоминают DBCC PAGE. Чтобы использовать эти недокументированные команды, Вы должны сначала установить флаг трассировки 3604, чтобы разрешить вывод недокументированных команд DBCC на экран клиента. DBCC IND, который требует три параметра, сообщает какие страницы принадлежат индексу. Первые два параметра: имя базы данных и имя таблицы; третий параметр устанавливает, какие результаты Вы хотите видеть в отчёте. Значение = "1", для третьего параметра степени подробность выводимой информации, говорит о том, что будут возвращены данные обо всех уровнях всех индексов в таблице. Код в Листинге №1 (см. в конце данной статьи) создает таблицу в 1000 строк в базе данных Pubs и генерирует последовательно увеличивающиеся целочисленные значения от 1 до 1000. Автор использует числовые значения, потому что они очень просто генерируются. Однако, он хранит их как символьные строки, потому что команда DBCC PAGE отображает символьные строки более ясно чем числовые значения, что удобно, если использовать команду DBCC PAGE для отображения полного содержания страниц.

После генерации 1000 строк, сценарий использует значение по умолчанию fill factor = 0, чтобы создать уникальный, кластерный индекс, затем используется DBCC IND, чтобы сгенерировать список всех страниц, которые принадлежат таблице и её индексам. DBCC IND возвращает 12-столбцов отчёта, но автору необходимы были только четыре из них:

- PagePID - идентификатор страниц, это значение будет использоваться во второй команде DBCC.
- IndexID - значение равное "0" устанавливается для страниц данных, "1" для страниц в верхних уровнях кластерного индекса, а большее чем "1" для не кластерных индексов.
- PageType - значение равное "1" устанавливается для страниц данных, "2" для индексных страниц, а "10" для страницы Index Allocation Map (IAM).
- IndexLevel - уровень индекса, на котором страница создана. Если IndexID равен "0", значит, IndexLevel также равен "0". Самое высокое значение IndexLevel у любого IndexID - для корневых страниц, причём, только одна страница будет иметь это максимальное значение IndexLevel.

Команда DBCC IND в сценарии Листинга №1 возвращает номера страниц для четырех страниц с PageType = 2; из них, три имеют IndexLevel = 0, а одна имеет IndexLevel = 1. Кроме того, если Вы работаете с базой данных, которая размещается более чем в одном файле, Вам будет также интересен столбец PageFID, который идентифицирует файл, содержащий страницу.

Примечание автора перевода: Если Вы используете для проверки приводимых в статье примеров кода вариант движка MSDE или у Вас не установлена база данных pubs, Вы можете отдельно установить её методом прикрепления из стандартного дистрибутива. Для MS SQL Server 2000 выглядеть это будет так: из дистрибутива, каталог …x86\DATA, скопируйте в нужное Вам расположение файлы pubs.mdf и pubs_log.ldf; снимите у этих файлов атрибут - только для чтения; в программе Enterprise Manager, посредством опции Databases\All Tasks\Attach Database прикрепите указанные файлы, откорректировав (если это необходимо) пути к их местоположению. После этого, вы получите сообщение об успешном прикреплении базы pubs и можете с ней работать.

Даже притом, что уровень листьев кластерного индекса хранит непосредственно данные, результат работы команды DBCC IND не рассматривает страницы данных как индексные страницы. Однако, эти будут именно те страницы данных, к которым относится значение fill factor, потому что они относятся к уровню листьев кластерного индекса. Вы можете идентифицировать эти страницы данных по следующей комбинации значений: PageType = 1, IndexID = 0, IndexLevel = 0.

 
« Предыдущая статья   Следующая статья »