Язык SQL, как мы уже видели, предназначен для организации доступа к базам данных.
При этом предполагается, что доступ к БД может быть осуществлен в двух режимах:
в интерактивном режиме и в режиме выполнения прикладных программ (приложений).
Эта двойственность
SQL создает ряд преимуществ:
Все возможности интерактивного
языка запросов доступны и в прикладном программировании.
Можно в интерактивном
режиме отладить основные алгоритмы обработки информации, которые в дальнейшем
могут быть готовыми вставлены в работающие приложения.
SQL действительно
является языком по работе с базами данных, но в явном виде он не является языком
программирования. В нем отсутствуют традиционные операторы, организующие циклы,
позволяющие объявить и использовать внутренние переменные, организовать анализ
некоторых условий и возможность изменения хода программы в зависимости от выполненного
условия. В общем случае можно назвать SQL подъязыком, который служит исключительно
для управления базами данных. Для создания приложений, настоящих программ необходимо
использовать другие, базовые языки программирования, в которые операторы языка
SQL будут встраиваться.
Базовыми
языками программирования могут быть языки С++, COBOL, PL/1, Pascal, PHP, Java. Существуют
два способа применения SQL в прикладных программах:
Встроенный SQL.
При таком подходе операторы SQL встраиваются непосредственно в исходный
текст программы на базовом языке. При компиляции программы со встроенными
операторами SQL используется специальный препроцессор SQL, который преобразует
исходный текст в исполняемую программу.
Интерфейс программирования
приложений (API application program interface). При использовании данного
метода прикладная программа взаимодействует с СУБД путем применения специальных
функций. Вызывая эти функции, программа передает СУБД операторы SQL и получает
обратно результаты запросов. В этом случае не требуется специализированный
препроцессор.
Процесс выполнения
операторов SQL может быть условно разделен на 5 этапов (см. рис. 12.1).
Рис.
12.1. Процесс выполнения операторов SQL
На первом этапе выполняется
синтаксический анализ оператора SQL. На этом этапе проверяется корректность
записи SQL-оператора в соответствии с правилами синтаксиса.
На этом этапе проверяется
корректность параметров оператора SQL: имен отношений, имен полей данных,
привилегий пользователя по работе с указанными объектами. Здесь обнаруживаются
семантические ошибки.
На этом этапе проводится
оптимизация запроса. СУБД проводит разделение целостного запроса на ряд минимальных
операций и оптимизирует последовательность их выполнения с точки зрения стоимости
выполнения запроса. На этом этапе строится несколько планов выполнения запроса
и выбирается из них один — оптимальный для данного состояния БД.
На четвертом этапе
СУБД генерирует двоичную версию оптимального плана запроса, подготовленного
на этапе 3. Двоичный план выполнения запроса в СУБД фактически является эквивалентом
объектного кода программы.
И наконец, только
на пятом этапе СУБД реализует (выполняет) разработанный план, тем самым выполняя
оператор SQL.
Следует отметить, что перечисленные этапы отличаются по числу обращений к БД и по процессорному
времени, требуемому для их выполнения. Синтаксический анализ проводится очень
быстро, он не требует обращения к системным каталогам БД. Семантический анализ
уже требует работы с базой мета-данных, то есть с системными каталогами БД,
поэтому при выполнении этого этапа происходит обращение к системному каталогу
и серьезная работа с ним. Этап, связанный с оптимизаций плана запроса, требует
работы не только с системным каталогом, но и со статистической информацией
о БД, которая характеризует текущее состояние всех отношений, используемых
в запросе, их физическое расположение на страницах и сегментах внешней памяти.
В силу указанных причин этап оптимизации наиболее трудоемкий и длительный
в процессе выполнения запроса. Однако если не проводить этап оптимизации,
то стоимость (время) выполнения неоптимизированного запроса может в несколько
раз превысить стоимость оптимизированного запроса. Время, потраченное на оптимизацию
запроса, с лихвой компенсирует затраты на выполнение неоптимизированного запроса.
Этапы выполнения операторов SQL одни и те же как в интерактивном режиме, так и внутри приложений.
Однако при работе с готовым приложением многие этапы СУБД может выполнить заранее.
Знаете ли Вы, что релятивистское объяснение феномену CMB (космическому микроволновому излучению) придумал человек выдающейся фантазии Иосиф Шкловский (помните книжку миллионного тиража "Вселенная, жизнь, разум"?). Он выдвинул совершенно абсурдную идею, заключавшуюся в том, что это есть "реликтовое" излучение, оставшееся после "Большого Взрыва", то есть от момента "рождения" Вселенной. Хотя из простой логики следует, что Вселенная есть всё, а значит, у нее нет ни начала, ни конца... Подробнее читайте в FAQ по эфирной физике.