Руководство администратора баз данных Inrformix.
Добавить в закладки К обложке
- 1. Теоретические основы. - Страница 1
- 1.1.1 Основные функции СУБД - Страница 2
- 1.1.2 Типовая организация современной СУБД - Страница 5
- 1.2 Понятие архитектуры клиент-сервер. - Страница 6
- 2. Теоретические основы СУБД сервера Informix OnLine v.7.X - Страница 7
- 2.1.1 Описание продуктов Informix - Страница 8
- 2.1.2 Типовые конфигурации - Страница 9
- 2.2 Архитектура СУБД сервера Informix OnLine v.7.X - Страница 10
- 2.2.1 . Динамическая масштабируемая архитектура - Страница 11
- 2.2.1.1 Потоки - Страница 12
- 2.2.1.2 Виртуальные процессоры - Страница 13
- 2.2.1.3 Планирование потоков - Страница 14
- 2.2.1.4 Разделение потоков между виртуальными процессорами. - Страница 15
- 2.2.1.5 Экономия памяти и других ресурсов - Страница 16
- 2.2.2 Организация разделяемой памяти - Страница 17
- 2.2.3 Организация операций обмена с дисками - Страница 18
- 2.2.3.1 Управление дисковой памятью - Страница 19
- 2.2.3.2 Асинхронный ввод-вывод - Страница 20
- 2.2.3.3 Опережающее чтение - Страница 21
- 2.2.4 Поддержка фрагментации таблиц и индексов - Страница 22
- 2.2.5 Параллельная обработка запросов - Страница 23
- 2.2.5.1 На чем основана технология PDQ - Страница 24
- 2.2.5.2 Итераторы - Страница 25
- 2.2.5.3 Примеры применения параллелизма - Страница 27
- 2.2.5.4 Баланс между OLTP и DSS-приложениями - Страница 28
- 2.2.6 Оптимизатор выполнения запросов по стоимости - Страница 29
- 2.2.7 Средства обеспечения надежности - Страница 30
- 2.2.7.1 . Зеркалирование дисковых областей - Страница 31
- 2.2.7.2 Тиражирование - Страница 32
- 2.2.7.3 Быстрое восстановление при включении системы - Страница 33
- 2.2.7.4 Архивирование и восстановление данных - Страница 34
- 2.2.8 Динамическое администрирование - Страница 35
- 2.2.8.1 Интерфейс мониторинга системы - Страница 36
- 2.2.8.2 Утилита DB/Cockpit - Страница 37
- 2.2.8.3 Утилита OnPerf - Страница 38
- 2.2.8.4 Утилита параллельной загрузки - Страница 39
- 2.2.9 Распределенные вычисления - Страница 40
- 2.2.9.1 Взаимодействие клиент-сервер - Страница 41
- 2.2.9.2 Прозрачность расположения данных - Страница 42
- 2.2.9.3 Распределенные базы данных и протокол двухфазовой фиксации транзакций - Страница 43
- 2.2.10 Поддержка национальных языков - Страница 44
- 2.2.11 Средства безопасности класса С2 - Страница 45
- 2.3 Дополнительные компоненты компании Informix для выполнения специфических задач. - Страница 46
- 2.3.1 Informix-Enterprise Gateway 7.1 - Страница 47
- 2.3.2 Технология и компоненты EDA/SQL - Страница 48
- 2.3.2.1 EDA API/SQL - Страница 49
- 2.3.2.2 EDA/Link - Страница 50
- 2.3.2.3 EDA/SQL Server - Страница 51
- 2.3.2.4 EDA/Data Drivers - Страница 52
- 2.3.3 Возможности Enterprise Gateway - Страница 53
- 2.3.3.1 Прозрачный доступ для чтения и записи - Страница 54
- 2.3.3.2 Распределенные соединения - Страница 55
- 2.3.3.3 Конфигурирование Enterprise Gateway - Страница 56
- 2.3.3.4 Безопасность - Страница 57
- 2.3.4 Библиотеки сопряжения сервера Informix-OnLine DS с менеджерами транзакций: Informix-TP/XA и Informix-TP/TOOLKIT - Страница 58
- 2.4 Заключение - Страница 59
- 2.5 Литература - Страница 61
2.2.5.2 Итераторы
Итератор - это программный объект, который осуществляет итеративную (циклическую) обработку некоторого множества данных. Итераторы различаются типом производимой обработки, но имеют единообразный внешний интерфейс. Каждый итератор открывает один (или более) входных потоков данных (data flow), последовательно считывает их и, после обработки, помещает результаты в выходной поток. Итератору безразличен источник входного потока и назначение выходного потока - это может быть диск, другой итератор, сетевое соединение. Мы будем говорить о поставщиках и потребителях потоков данных. Ниже перечислены типы итераторов, применяемые в INFORMIX-OnLine DS:
SCAN - Сканирует фрагментированные и нефрагментированные таблицы и индексы. NESTED LOOP JOIN - Реализует стандартную логику соединений методом вложенных циклов (читает строку из одной таблицы, находит все совпадения во второй таблице, читает следующую строку из первой таблицы и т. д.). MERGE JOIN - Выполняет фазу слияния для соединения методом сортировки и слияния. HASH JOIN - Реализует новый метод соединений с хешированием. Для одной из двух соединяемых таблиц строится хеш-таблица, вторая таблица зондируется. Оптимизатор решает, какая из таблиц будет хешироваться. GROUP - Группирует данные (GROUP BY) и вычисляет агрегатные функции. SORT - Сортирует данные. MERGE - Выполняет объединения UNION и UNION ALL (для UNION используется комбинация итераторов MERGE и SORT). REMOTE - Реализует удаленные сканирования для операторов SELECT.
Итератор как программный объект состоит из статических и динамических структур данных. Статическая структура содержит ссылки на функции (или методы), применимые к итератору. Динамическая структура содержит информацию о текущем состоянии итератора (открыт, закрыт, выполняет очередную итерацию), одну или две ссылки на поставщиков.
Методы итератора
CREATE() - Создает итератор. Выделяет память для итератора, инициализирует его структуры, а также остальные методы (open(), next(), close(), free()), т.е. устанавливает ссылки на функции, соответствующие данному типу итератора. Затем вызывает метод create() для своих итераторов-поставщиков, которые создадут своих поставщиков, если таковые имеются, и т. д. Таким образом, вызов метода create() для корневого итератора приводит к созданию всего дерева итераторов.
OPEN() - Запускает итератор. Выполняются специфические для данного типа итератора инициализирующие действия, возможно, запрос дополнительной памяти. Например, при запуске итератора сканирования определяется, какие фрагменты необходимо сканировать, устанавливается указатель на первый из них, создается временная таблица (если она нужна), посылается сообщение
MGM (MGM - компонента сервера, которая регулирует выделение ресурсов под запросы, обрабатываемые средствами PDQ; см. об этом ниже, п. "Баланс между OLTP и DSS-приложениями") о запуске потока сканирования. Далее применяется метод open() по отношению к поставщикам итератора, которые применят его к своим поставщикам и т.д. Таким образом, для запуска всего дерева итераторов достаточно применить метод open() к корневому итератору.
NEXT() - Выполняет одну итерацию. Выполнение начинается с того, что итератор применяет метод next() к своим поставщикам, заставляя их также применить next() к своим поставщикам и т. д., пока не сработают итерации поставщиков нижнего уровня. Затем данные поднимаются снизу вверх - каждый итератор, получив данные от своего поставщика, применяет к ним свой специфический вид обработки и передает результат своему потребителю. Метод next() применяется циклически, пока не поступит признак конца потока данных.
CLOSE() - Закрывает итератор. Высвобождает память, выделенную при запуске. Фактически, эта память могла уже быть высвобождена методом next(), когда он получил признак конца данных, поскольку общий принцип состоит в том, чтобы освобождать память сразу же, как только она становится не нужна. Однако, это не всегда возможно. Поэтому на метод close() возлагается ответственность за то, чтобы память в любом случае была освобождена.
Метод close() рекурсивно применяется к поставщикам, тем самым, закрывается все дерево итераторов.
FREE() - Освобождает итератор. Высвобождает память, выделенную при создании. Применяет free() к поставщикам, таким образом, освобождается все дерево итераторов.