Одним из назначений базы данных является сохранение, поиск и изменение данных. Поэтому Database Engine, как и любая другая система базы данных, должна выполнять множество действий с дисками. В отличие от других системных ресурсов дисковая подсистема имеет две движущиеся части: сам диск и дисковые головки. На вращение диска и перемещение дисковых головок требуется очень много времени, поэтому чтение с диска и запись на диск являются двумя высокозатратными операциями, которые выполняет система базы данных. (Например, доступ к диску обычно медленнее доступа к оперативной памяти на два порядка и более.)
Database Engine сохраняет данные в страницах размером 8 Кбайт. Кэш буфера оперативной памяти также разделен на страницы по 8 Кбайт. Система читает данные в единицах страницы. Операции чтения появляются не только при поиске данных, но также и при любых операциях модификации, таких как update и delete, потому что система должна прочесть данные, прежде чем она сможет их модифицировать.
Если нужная страница находится в буфере кэша, она будет читаться из памяти. Такая операция ввода/вывода называется логическим вводом/выводом или логическим чтением. Если страница не находится в памяти, то она читается с диска и помещается в буфер кэша. Такая операция ввода/вывода называется физическим вводом/выводом или физическим чтением. Буфер кэша разделяется между всеми пользователями, потому что Database Engine использует архитектуру только с одним адресным пространством памяти. Поэтому много пользователей могут обращаться к одной и той же странице. Логическая запись происходит, когда данные модифицируются в буфере кэша. Аналогично, физическая запись происходит, когда страница записывается из буфера кэша на диск. Поэтому может быть выполнено множество операций логической записи для одной страницы, прежде чем она будет записана на диск.
Database Engine имеет несколько компонентов, которые оказывают очень большое влияние на производительность, потому что они потребляют большое количество ресурсов ввода/вывода:
♦ упреждающее чтение;
♦ контрольные точки.
Упреждающее чтение описывается в следующем разделе, а контрольные точки подробно рассматривались.
Оптимальным поведением системы базы данных является чтение данные и без ожидания завершения операции чтения с диска. Лучшим способом решения такой задачи является тот случай, когда известно несколько страниц, которые потребуются пользователю, и чтение этих страниц с диска в буферный пул, прежде чем они будут запрошены пользовательским процессом. Этот механизм называется упреждающим чтением, он позволяет системе оптимизировать производительность, эффективно обрабатывая большой объем данных.
Компонент Database Engine, называемый Read Ahead Manager, внутренне управляет процессами упреждающего чтения, так что пользователь не имеет возможности повлиять на этот процесс. Вместо использования страниц по 8 Кбайт Database Engine использует блоки данных размером 64 Кбайт в качестве единицы чтения для упреждающего чтения. Благодаря этому пропускная способность для запросов ввода/вывода значительно увеличивается. Механизм упреждающего чтения используется системой базы данных для выполнения сканирования больших таблиц и сканирования индексных диапазонов. Сканирование таблицы выполняется с использованием информации, которая хранится в страницах схемы размещения индексов (index allocation map, 1AM) для создания последовательного списка дисковых адресов, которые должны быть прочитаны. (Страницы 1АМ являются страницами размещения, хранящими информацию об экстентах, которые используются таблицами или индексами.) Это позволяет системе базы данных оптимизировать ее ввод/вывод путем объемного последовательного чтения с диска. Read Ahead Manager читает до 2 Мбайт данных за один раз. Каждый экстент читается единственной операцией.
Для индексного диапазона Database Engine использует информацию из промежуточного уровня индексных страниц, непосредственно перед уровнем листьев, для определения того, какие страницы нужно читать. Система сканирует все эти страницы и создает список страниц листьев, которые должны быть прочитаны. В процессе этой операции распознаются смежные страницы и читаются за одну операцию. Если требуется отыскать много страниц, Database Engine формирует блок чтений в один раз.
Механизм упреждающего чтения также может иметь и негативное влияние на производительность, если приходится читать слишком много страниц, и буфер кэша излишне переполняется. Единственное, что вы можете сделать в этом случае, - это создать индексы, которые вам действительно необходимы.
Существует несколько счетчиков производительности и представлений динамического управления, которые связаны с деятельностью упреждающего чтения. Они рассматриваются позже В этом разделе.