- •Часть 1
- •Глава 1. Управление базами данных.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных
- •Свойства
- •1.4. Почему база данных
- •1.5.Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •1.5. А)
- •Глава 2.
- •2.1. Цель
- •2.2. Три уровня архитектуры
- •2.3. Внешний уровень
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура клиент/сервер
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •Глава 3.
- •3.1. Введение
- •3.2. Реляционные системы
- •3.3. Замечание относительно терминологии
- •3.4. Реляционная модель
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые таблицы и представления
- •3.8. Язык sql
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
3.5. Оптимизация
Как уже объяснялось выше, реляционные операции, такие как SELECT, PROJECT и JOIN, выполняются на уровне множеств. Поэтому реляционные языки, такие как SQL, часто называют непроцедурными, так как пользователь указывает, что делать, а не как делать, т.е. пользователь говорит, что ему нужно, без указания процедуры получения результата. Процесс "навигации" по хранимой базе данных для удовлетворения пользовательского запроса выполняется системой автоматически, а не пользователем вручную. Поэтому реляционные системы иногда называют системами автоматической навигации. В нереляционных системах за навигацию по базе данных в основном несет ответственность пользователь. На рис. 3.3 приведена яркая иллюстрация преимуществ автоматической навигации— оператору SQL insert противопоставлен код, выполняющий навигацию "вручную"; подобный код, возможно, должен написать пользователь нереляционной системы для получения того же результата.
Несмотря на эти замечания, следует отметить, что "непроцедурный" — это хотя и общепринятый, но не совсем точный термин, потому что процедурный и непроцедурный — понятия относительные. Можно лишь с уверенностью сказать, что язык А более (или менее) процедурный, чем язык Б. Поэтому точнее будет сказать, что реляционные языки, такие как SQL, принадлежат более высокому уровню абстракции, чем языки программирования, такие как С или COBOL (или подъязыки данных, обычно принадлежащие нереляционным СУБД; убедитесь в этом сами — см. рис. 3.3)
INSERT INTO SP ( S#, P#, QTY )
______VALUES ( 'S4', 'P3', 1000 )
MOVE 'S4' TO S# IN S
FIND CALC S
ACCEPT S-SP-ADDR FROM S-SP CURRENCY
FIND LAST SP WITHIN S-SP
while SP found PERFORM
ACCEPT S-SP-ADDR FROM S-SP CURRENCY
FIND OWNER WITHIN P-SP
GET P
IF P# IN P < 'P3'
leave loop
END-IF
FIND PRIOR SP WITHIN S-SP
END-PERFORM
MOVE 'P3' TO P# IN P
FIND CALC P
ACCEPT P-SP-ADDR FROM P-SP CURRENCY
FIND LAST SP WITHIN P-SP
while SP found PERFORM
ACCEPT P-SP-ADDR FROM P-SP CURRENCY
FIND OWNER WITHIN S-SP
GET S
IF S# IN S < 'S4'
leave loop
END-IF
FIND PRIOR SP WITHIN P-SP
END-PERFORM
MOVE 1000 TO QTY IN SP
FIND DB-KEY IS S-SP-ADDR
FIND DB-KEY IS P-SP-ADDR
STORE SP
CONNECT SP TO S-SP
CONNECT SP TO P-SP
Рис. 3.3. Автоматическая и ручная навигация
Вообще, возросший уровень абстракции соответствует увеличению продуктивности реляционных систем.
Ответственность за то, как выполняется автоматическая навигация, несет очень важный компонент СУБД — оптимизатор. Другими словами, работа оптимизатора заключается в том, чтобы для каждого запроса пользователя выбрать самый эффективный способ выполнения этого запроса. Предположим, например, что пользователь сделал следующий запрос:
RESULT := ( ЕМР WHERE ЕМР# = 'Е4' ) [ SALARY ] ;
Пояснение. Выражение в первых скобках (емр where ...) означает запрос выборки строк из таблицы ЕМР, а именно строки, в которой значение ЕМР# равно Е4. Название столбца в квадратных скобках (salary) означает запрос выборки столбцов (также называемый проекцией) из результата выборки строк, а именно столбца SALARY. И, наконец, оператор присвоения (:=) означает запрос присвоения результата выборки столбцов таблице RESULT. Следовательно, после выполнения запроса RESULT — это таблица из одной строки и одного столбца, содержащая зарплату служащего Е4. (Здесь использован синтаксис реляционных операций, который подробно будет описан в следующих главах. Обратите также внимание, что в данном случае в явном виде используется реляционное свойство замкнутости: мы написали вложенное выражение, в котором результат выборки строк — это входные данные для выборки столбцов.)
Даже в этом простом примере существует, по крайней мере, два способа выполнения поиска необходимых данных.
1. Последовательный физический просмотр таблицы ЕМР (хранимой версии), пока не будет найдена требуемая запись.
2. Если есть индекс для столбца ЕМР# (в хранимой версии) таблицы (который, вероятно, действительно существует, поскольку этот столбец является первичным ключом, а большинство систем фактически требуют создания индекса по первичному ключу), то переход с помощью этого индекса непосредственно к данным служащего Е4.
Оптимизатор выберет, какую из этих двух стратегий применить. В общем случае для реализации любого определенного отдельного реляционного запроса оптимизатор будет делать выбор стратегии на основе соображений, подобных следующим:
• на какие таблицы есть ссылки в запросе (может быть несколько ссылок, если, например, используются какие-то соединения);
• насколько велики эти таблицы;
• какие индексы созданы;
• как выбраны эти индексы;
• как физически группируются данные на диске;
• какие реляционные операции используются и т.д.
Поэтому повторяем — пользователь указывает в запросе, какие данные требуются для него, а не как получить эти данные; стратегия доступа к данным выбирается оптимизатором (автоматическая навигация). Поэтому пользователи и пользовательские программы обретают независимость от таких стратегий доступа, которая, конечно, необходима, если мы хотим достичь независимости данных.
Более подробные сведения об оптимизаторе можно получить в главе 18.