Язык 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 одни и те же как в интерактивном режиме, так и внутри приложений.
Однако при работе с готовым приложением многие этапы СУБД может выполнить заранее.
Знаете ли Вы, как разрешается парадокс Ольберса? (Фотометрический парадокс, парадокс Ольберса - это один из парадоксов космологии, заключающийся в том, что во Вселенной, равномерно заполненной звёздами, яркость неба (в том числе ночного) должна быть примерно равна яркости солнечного диска. Это должно иметь место потому, что по любому направлению неба луч зрения рано или поздно упрется в поверхность звезды. Иными словами парадос Ольберса заключается в том, что если Вселенная бесконечна, то черного неба мы не увидим, так как излучение дальних звезд будет суммироваться с излучением ближних, и небо должно иметь среднюю температуру фотосфер звезд. При поглощении света межзвездным веществом, оно будет разогреваться до температуры звездных фотосфер и излучать также ярко, как звезды. Однако в дело вступает явление "усталости света", открытое Эдвином Хабблом, который показал, что чем дальше от нас расположена галактика, тем больше становится красным свет ее излучения, то есть фотоны как бы "устают", отдают свою энергию межзвездной среде. На очень больших расстояниях галактики видны только в радиодиапазоне, так как их свет вовсе потерял энергию идя через бескрайние просторы Вселенной. Подробнее читайте в FAQ по эфирной физике.