Каждая страница начинается с 96-байтового заголовка, используемого для хранения системной информации - идентификатор страницы, идентификатор объекта базы данных, которому принадлежит страница, ссылки на предыдущую и последующую страницу в цепочке страниц, тип страницы, объем свободного места на странице, для индексных страниц уровень страницы (уровень листьев является уровнем О, первый промежуточный уровень является уровнем 1 и т. д.) и др.
Строки данных заносятся на страницу последовательно, сразу же после заголовка. Каждая новая строка сохраняется после уже сохраненных строк, пока страница не будет заполнена. Если на странице нет достаточного места для размещения новой строки той же таблицы, строка сохраняется на следующей странице в цепочке страниц.
Для всех таблиц, которые имеют только столбцы фиксированной длины, одно и то же количество строк хранится на каждой странице.
Если же таблица имеет хотя бы один столбец переменной длины (например, столбец VARCHAR), то количество строк на страницах может отличаться, и система помещает на страницу столько строк, сколько эта страница может вместить.
Таблицы SQL Server используют один из двух методов организации страниц данных:
- Кучи - это таблицы, которые не имеют кластеризованного индекса;
- Кластеризованные таблицы - это таблицы, имеющие кластеризованный индекс.
Все индексы имеют одинаковую, рассмотренную выше B-tree структуру.
Рассмотрим организацию кучи и кластеризованной таблицы и алгоритмы работы с ними в операциях обработки данных.
В таблицах, которые не имеют кластеризованного индекса (Куча, heap), строки данных хранятся без определенного порядка (не отсортированы), и какой-либо порядок в последовательности страниц данных отсутствует. Страницы данных не образуют связный список.
На рисунке 2.3 показана таблица данных, организованная в виде кучи (используется таблица Customers из базы данных Northwind, входящей в поставку СУБД MS SQL Server [ 11J). Для упрощения на рисунке приведено только ключевое поле (Фамилия), со значениями ROMEY, MORGK и т.д. Записи не упорядочены. Страницы данных имеют последовательные номера 10, 11, 12, 13, 14.
При отсутствии индекса, чтобы найти искомые записи, SQL Server последовательно читает (сканирует) всю таблицу. Например, для поиска записи, удовлетворяющей условию CustomerlD = ‘ВОТТМ’ SQL Server прочитает все записи, начиная с первой и заканчивая последней, и выберет те, которые будут удовлетворять указанному условию (на странице 13, первая строка).