Механизм доступа к данным. Язык структурированных запросов SQL. История и стандарты SQL. Обработка команд SQL сервером Oracle, страница 2

·  Для выполнения команды SQL в программной глобальной области открывается курсор – указатель или имя частной области SQL, выделенной для выполнения SQL команды. Частная область SQL располагается целиком в программной глобальной области или частично в системной глобальной области, в зависимости от конфигурации сервера.

o  Неявный курсор открывается и обрабатывается автоматически при выполнении любой команды SQL

o  Явный курсор определяется в приложении и обрабатывается разработчиком приложения

·  Кэш буферов базы данныххранит старые версии обновленных данных в буферах сегментов отката и новые версии в буферах сегментов данных

o  Если тре6уемые данные отсутствуют, серверный процесс считывает их из файлов данных в буфера сегментов данных кэша буферов базы данных. Когда команда SQL изменяет данные, эти изменения делаются именно в буферах сегментов данных

o  Oracle сохраняет первоначальную версию данных в буферах сегментов отката. Информация из сегментов отката используется при отмене изменений в данных и восстановлении предыдущих значений

·  Фоновый процесс DBWR записывает все измененные буфера на диск. Наиболее часто используемые буфера остаются в оперативной памяти с помощью алгоритма LRU. DBWR записывает измененные буфера на диск в следующих случаях:

o  Список измененных  буферов достигает пороговой длины

o  При просмотре заданного числа буферов в списке LRU не найдено ни одного свободного буфера

o  Истекло контрольное время ожидания

o  В случае выполнения контрольной точки

Стадии выполнения команды SQL

 
Все команды SQL обрабатываются серверным процессом, который получает команды SQL непосредственно от процесса пользователя. Обработка команды происходит в несколько стадий, количество которых зависит от типа выполняемого утверждения (Рисунок 2).

Рисунок 2 Стадии обработки команды SQL

Выполнение команды DML

Для выполнения команды UPDATE требуются сегменты отката, информация которых используется для обеспечения целостности чтения, для отката и восстановления предыдущих значений. Обработка команды DML происходит следующим образом:

1.  Открытие курсора (OPEN)

 При выполнении команды SQL или вызове программной единицы в первую очередь выделяется частная область SQL, в которой будет выполняться обработка команды. Курсор создается, независимо от типа команды SQL. В большинстве случаев курсор открывается автоматически (неявный курсор). Однако курсор может быть явно описан в приложении (явный курсор), то предоставляет дополнительные возможности разработчику по управлению курсором. В течение одного сеанса может быть открыто несколько курсоров одновременно (максимальное количество определяется параметром инициализации).

2.  Компиляция выражения (PARSE)

Серверный процесс, получивший команду SQL, разбирает утверждение, если не существует разделяемой области SQL для идентичного SQL-утверждения:

o  Проверяется синтаксис и семантика команды

o  Проверяются по словарю данных используемые объекты

o  Накладываются блокировки в словаре данных на используемые объекты, чтобы их определение не могло быть изменено во время разбора SQL-утверждения

o  Проверяются по словарю данных привилегии пользователя на доступ к запрашиваемым данным

o  Определяется план выполнения команды (строится дерево разбора)

o  Разобранное выражение загружается в разделяемую область SQL

На этапе компиляции выявляются только те ошибки, которые могут быть идентифицированы перед выполнением утверждения. Например, нарушение целостности данных, заключающееся в попытке вставит строки с повторяющимся первичным ключом, не может быть выявлено на этапе компиляции.

3.  Связывание переменных (BIND)

На этом этапе серверный процесс понимает смысл утверждения SQL, но еще не располагает информацией, достаточной для его выполнения. Если в SQL-команде использовались переменные, серверному процессу необходимы значения этих переменных. Серверный процесс ищет переменные по адресу, если переменные определены к этому моменту, или запрашивает значение переменных подстановки.

4.  Выполнение утверждения (EXECUTE)

К этому моменту серверный процесс обладает всей необходимой информацией, и может, следовательно, выполнить утверждение:

o  Запрашиваются блоки сегментов данных в кэше буферов базы данных

o  Запрашиваются блоки сегментов отката в кэше буферов базы данных

o  Устанавливаются монопольные блокировки для строк, которые предполагается изменить

o  В буфере журнала сохраняются старые и новые данные

o  Сохраняются данные в буферах сегментов отката

o  Изменяются блоки сегментов данных в кэше буферов базы данных

5.  Закрытие курсора (CLOSE)

Курсор, открытый для выполнения команды SQL, закрывается на последней стадии обработки SQL-утверждения.

Выполнение команды SELECT

Запросы (SELECT) отличаются от других типов SQL-утверждений, т.к. они возвращают строки в результате успешного выполнения команды. Поэтому обработка запроса отличается от обработки других команд DML.

1.  Открытие курсора (OPEN)

Для выполнения запроса, как и для выполнения любой другой команды SQL, требуется создание частной области SQL.

2.  Компиляция выражения (PARSE)

Компиляция запроса происходит так же, как и компиляция любого другого утверждения.

3.  Описание результирующей таблицы (DESCRIBE)

Результат запроса всегда возвращается в виде таблицы (это связано с тем, что результатом операций над отношениями всегда являются отношения). Стадия описания результирующей таблицы необходима только в том случае, если ее характеристики (типы данных, размерности и имена) неизвестны (например, вводятся пользователем интерактивно с помощью переменных подстановок).

4.  Определение вывода для запроса (DEFINE)

На этой стадии определяется местоположение, размерности и типы данных переменных, в которые будет происходить выборка данных из курсора. В случае необходимости выполняется преобразование типов данных.

5.  Связывание переменных (BIND)

Если в запросе использовались переменные, серверному процессу, как и в случае выполнения любой другой команды DML, необходимы значения этих переменных.

6.  Выполнение утверждения (EXECUTE)

Запрос выполняется, причем, т.к. данные не изменяются утверждением SELECT, не требуются блокировки строк и использование сегментов отката.

7.  Выборка строк (FETCH)

К этому моменту строки, удовлетворяющие запросу, находятся в частной области SQL, и, следовательно, могут быть выбраны. Каждая последующая выборка извлекает строку из курсора, и указатель курсора перемещается к следующей строке. Выборка происходит до тех пор, пока не будет выбрана последняя строка курсора.

8.  Закрытие курсора (CLOSE)

На последней стадии обработки запроса, как и при обработке любой другой команды DML, закрывается курсор, открытый для выполнения запроса.

Если во время обновления данных одним пользователем с помощью команды UPDATE или DELETE, другой пользователь запрашивает  те же самые данные, серверный процесс создаст целостный образ измененной строки. Если блок уже изменен, но изменения не зафиксированы, серверный процесс использует информацию из сегментов отката.

Команду SELECT можно рассматривать, как операцию чтения, а команду DML – как операцию записи. Процессы «читатели» и процессы «писатели» не мешают друг другу. Это достигается за счет использования сегментов отката.

Выполнение команд DDL

Выполнение команды DDL отличается от выполнения запросов и команд DML, т.к. требует записи в словарь данных. Поэтому стадия компиляции включает в себя разбор предложения, просмотр словаря данных и, собственно, выполнение.

 
Литература

1.  Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.

2.  Джеймс Р. Грофф, Пол Н. Вайнберг SQL: полное руководство: пер. с англ. - -К.: Издательская группа BHV, 1998.