Продолжается подписка на наши издания! Вы не забыли подписаться?

Informix Dynamic Server.2000 (v. 9.2)

Интернет становится одним из определяющих факторов современного бизнеса.  Именно это является причиной того, что практически все производители СУБД сегодня позиционируют свои продукты как средства эффективного хранения и организации информации для работы в Сети. Informix не является исключением, более того, специально для Интернет этой компанией создана СУБД Informix Internet Foundation.2000. Именно этот продукт и был предоставлен Informix для данного обзора. Однако мы не будем рассматривать Informix Internet Foundation.2000 в целом. Наша задача несколько уже, и касается только собственно сервера БД.

Основу Informix Internet Foundation.2000 составляет Informix Dynamic Server 2000 — мощное многопоточное ядро БД компании Informix. Ядро СУБД обеспечивает расширяемость, что позволяет управлять логикой бизнес-процессов, создавать нетрадиционные типы данных и так далее.

Продукт существует в версиях для UNIX, Linux и Windows NT.

Преимущество подхода Informix состоит в возможностях поддержки любых видов данных, которые можно себе представить, вплоть до самых неожиданных. Это дает возможность пользователям не только хранить такие данные в БД, но и дополнять ее новыми, только появляющимися видами информации.

Кроме Informix Dynamic Server 2000 в состав поставки Informix Internet Foundation.2000 включены и некоторые средства разработки и развертывания Интернет-приложений.

Первичная установка

Начало установки Informix Dynamic Server.2000 не предвещало ничего страшного. Красивый InstallShield-овский Setup показал красивую картинку, попросил ввести номер, пароль и предложил выбрать устанавливаемые продукты. Внешне все красиво и замечательно. Но радужное настроение очень быстро развеялось. При попытки нажать кнопку Next нам было выдано сообщение о том, что какой-то OnWeb не может быть установлен, так как не установлен ActivePerl (напомним, что установка производилась из WinNT 4.0 SP 6). Про Web в этой статье мы писать не собирались (а что можно подумать о ПО с таким названием?), и спокойно проигнорировали выданное сообщение... А напрасно.

После нажатия еще пары раз на кнопку Next начался процесс установки и мы, в надежде, что такой большой продукт, как Informix Dynamic Server.2000, будет устанавливаться долго, пошли пить чай. Каково же было наше изумление, когда через 20 минут на экране мы увидели очередной вопрос инсталлятора! Оказалось, что красивый и большой инсталлятор — всего лишь оболочка для кучи маленьких, придирчивых инсталляторов. Каждый из них задает кучу вопросов, и почему их всех не объединили в один общий, задающий все вопросы в самом начале, а то и просто позволяющий создать список стандартных ответов, непонятно. Но главная закавыка оказалась не в инсталляторе. После установки в меню Start\Programs\Informix… не оказалось не одного средства администрирования. Из прошлого опыта общения с предыдущей версией Informix, 7.3, мы помнили, что должна быть утилита Informix Enterprise Control Center (IECC). Мы стали искать его следы. И даже нашли его описание в документации, но загадочное слово "download" нас смутило. Неужели его надо скачивать с Internet? Ничего не понимая, мы позвонили в Московский офис Informix. Там нам объяснили, что IECC с Informix Dynamic Server.2000 не поставляется, а вместо него предлагается использовать тот самый OnWeb, который успешно отказался ставиться в отсутствие ActivePerl. В Informix не смогли вспомнить, откуда они его скачали. Мы все-таки отыскали ActivePerl, найдя ссылку на него, как это ни смешно, в MSDN.

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

После инсталляции ActivePerl'а OnWeb успешно установился (хотя и не без непонятных сообщений о том, что он чего-то не нашел, и что он это что-то поставит).

Если вы думаете, что на этом наши приключения окончились, то вы ошибаетесь. На этом они только начались. Оказалось, что теперь нам надо не много, не мало сконфигурировать и запустить Web-сервер. Под управлением этого Web-сервера и должен работать OnWeb. Самое смешное, что в своих мытарствах мы ставили Informix Dynamic Server.2000 не на один компьютер, и тот компьютер, на который его устанавливали сейчас, работал не под управлением WinNT 4, а под W2k. Разумеется, инструкция, написанная для WinNT 4, соответствовала W2K, мягко говоря, не полностью. Так что когда после выполнения всех инструкций OnWeb не заработал, никто особо не удивился.

ONWeb-SQL1.bmp (240118 bytes)

Рис.1. OnWeb- утилита администрирования Informix Dynamic Server.2000

Другой сотрудник нашей организации повторил эксперимент по установке OnWeb на WinNT 4 Workstation, но, увы, результат был тем же. В списке серверов находились две записи, даже отдаленно не напоминающие наш. За ними следовала надпись, которая гласила, что надо нажать на какую-то Configure (по видимому кнопку), но где и чем, сказано не было (никаких других надписей, содержащих это слово, не нашлось). Полазив по интерфейсу, покопавшись в документации (мы еще не говорили, ее очень много), мы опять позвонили в Informix. Сначала нас просто не поняли и предложили переустановить Informix Dynamic Server.2000 на компьютер, не входящий в домен (?!?). Но потом оказалось, что надо всего лишь настроить еще один конфигурационный файл (...\informix\ONWeb\etc\onwebcfg), о котором просто забыли сказать в инструкции по установке. Кстати, после его ручной настройки в списке серверов появилась та самая кнопка Configure. Конечно, если перед установкой прочесть не краткую инструкцию по установке, а проштудировать всю документацию, относящуюся к OnWeb, и другие руководства по установке, можно было и обойти большинство из возникших при установке проблем, но наша бдительность была сильно притуплена простыми и удобными инсталляторами других поставщиков (особенно Oracle и Microsoft). Честно говоря, в начале 21-го века можно понять, что деньги надо вкладывать не только в продукт и документацию к нему, но и в упрощение и улучшение программ установки. Если часть денег, потраченных на бумажные руководства, перебросить на создание инсталлятора, то можно было бы и облегчить страдания пользователей, и даже немного сэкономить.

Средства администрирования

С Informix Dynamic Server.2000 поставляется комплексная утилита администрирования под названием OnWeb (та самая). Ее внешний вид представлен на Рис. 1. Называется она так потому, что создана на базе http-сервера. Она позиционируется как комплексное средство администрирования, и для администрирования готовой системы, где в основном надо делать резервные копии и следить за работоспособностью БД, подходит неплохо. Но для разработчиков, а именно для них мы и издаем этот журнал, она подходит плохо.

Большинство функций этого продукта носят информационный характер. То есть информацию получить можно, но внести изменения нельзя. Пожалуй, все, что можно сделать с помощью этого продукта — backup и управление транзакциями. Да, еще можно выполнять SQL-запросы. Правда, окошко для SQL-выражений очень маленькое и работать в нем не слишком удобно. О подсветке синтаксиса или о загрузке/записи SQL-скриптов и говорить не приходится. К тому же отменить выполнение операции нельзя. То есть остановить обработку html-странички можно, но сама операция при этом не прерывается. Да к тому же при выводе результат запроса выводится не как таблица (колонки по вертикали, а строки по горизонтали), а по полям (по одному полю) — см. Рис. 1. Так что таблица с десятью полями занимает десять строк. Самое же неприятное, что результат запроса вне зависимости от его размеров передается обратно за один прием. К чему это приводит, вы, наверное, догадываетесь. Но все же выполнять SQL-запросы с помощью этого средства удобнее, чем из утилит InterBase или Oracle.

Следует заметить, что существует набор утилит для управления объектами сервера Informix Dynamic Server.2000 — DBToolkit, в состав которого входят Table Editor, Privilege Editor и SQL-консоль. К сожалению, эти средства не входили в полученный нами продукт, и мы не можем их здесь рассматривать. Но они вполне доступны через Интернет, причем бесплатно. По сообщению представителей Informix, сейчас DBToolkit уже включен в состав IIF.2000.

Начальное администрирование

Если отбросить мытарства, описанные выше, то самой большой, а главное, непонятной проблемой стало то, что Informix Dynamic Server.2000 не умеет автоматически расширять размеры лог-файлов и файлов табличного пространства. И самое скверное, он даже не смог нормально сообщить о возникшей проблеме. То есть при превышении транзакцией пространства, отведенного под логи, она просто виснет. Честно говоря, это плохо вяжется с богатством возможностей сервера, ведь автоматическое приращение логов есть даже в MS SQL Server 7.0 и InterBase. А может, потому оно там и есть, что эти компании предпочли простоту установки и настройки объектно-ориентированным наворотам, предоставив Informix гордое звание первопроходца;-).

Многопроцессорная обработка

Informix Dynamic Server.2000 — один из немногих серверов, способных эффективно использовать многопроцессорные системы. Технология параллельных запросов к данным (PDQ) использует преимущества таких архитектур.

Поддержку многопроцессорности в Informix Dynamic Server.2000 нам удалось задействовать не сразу. Дело было в том, что для параллельного использования нескольких процессоров при выполнении SQL-запроса требуется изменить определенные параметры в конфигурационном файле etc\onconfig. имя_сервера вручную, а мы предполагали, что сервер сам распознает конфигурацию машины. После редактирования параметров NUMCPUVPS, SINGLE_CPU_VP и MULTIPROCESSOR сервер начинает использовать столько процессоров, сколько ему будет предоставлено. Особый смысл в этом появляется при использовании компьютеров, содержащих четыре или более процессоров. С помощью этих (и нескольких других) параметров можно точно указать серверу количество отведенных ему ресурсов, позволив машине в то же время выполнять и другие задачи.

При выполнении запроса требуется напрямую приказать серверу (переменной среды PDQPRIORITY) обрабатывать этот запрос с помощью нескольких процессоров. Эту переменную можно задать непосредственно из SQL-запроса. Выглядит это примерно так:

SET PDQPRIORITY 100;
SELECT sum(f_float1) FROM tmr;

После этого сервер действительно начал распараллеливать запрос, задействуя оба процессора машины. В среднем производительность при выполнении вышеприведенного запроса на таблице, содержащей 1 миллион записей, выросла на 30% (на двухпроцессорной машине).

Совместимость с SQL-92

Informix Dynamic Server.2000 полностью совместим с SQL-92 Entry Level (ANSI X3.135-1992), идентичным ISO 9075:1992. Кроме этого, многие возможности серверов БД Informix совместимы со стандартами SQL-92 Intermediate и Full Level, и X/Open SQL CAE.

Драйверы

ODBC

Informix Dynamic Server.2000 совместим с MS ODBC 3.0. Реализовано большинство функций этого стандарта.

Поддерживается потокобезопасность, что дает возможность использования ODBC-драйвера Informix в многопоточных серверах приложений.

Диалог настройки ODBC явно перегружен опциями и параметрами, но, к счастью, самые сложные из них по умолчанию заполнены правильными значениями.

Odbc.bmp (69070 bytes)

Рисунок 2.

В драйвере реализована работа с расширенными типами данных Informix (Row, SET и т. п.), но сделано это несколько странно. Чтобы получить данные из колонки типа Row или SET, нужно при выборке объявить ее как SQL_C_BINARY и подставить в качестве приемной переменной специальный хэндл. После того, как строка считана, надо выполнить еще один SQL-запрос, вызывающий хранимую процедуру ifx_rc_fetch. В качестве одного из параметров ей передается полученный ранее хэндл. Результат запроса, полученный при выполнении этой процедуры и будет содержимое колонки расширенного типа.

OLE DB — ADO

Для Informix Dynamic Server.2000 имеется собственный OLE DB-провайдер. К сожалению, он у нас не заработал, хотя мы выполнили все требования, указанные в разделе "Configuring OLE DB" из "Informix Client Products Installation Guide". К тому же по умолчанию OLE DB-провайдер не устанавливается. Для его установки необходимо выбрать Custom-режим при установке клиентского программного обеспечения и явно указать, что надо устанавливать OLE DB-провайдер. Нам также показалось странным то, что после установки необходимо выполнить специальный SQL-скрипт (coledbp.sql), инициализирующий БД sysmaster.

Из документации мы почерпнули информацию о том, что OLE DB-провайдер Informix поддерживает только apartment-модель потоков, то есть не поддерживает модель свободных потоков. Это безразлично для VB-программистов но может помешать планам C++-программистов. Также не поддерживаются распределенные MS DTS-транзакции в MTS/COM+.

JDBC

Informix Dynamic Server.2000 поддерживает интерфейс взаимодействия с базами данных JDBC (Java Database Connectivity).

Всего для Informix Dynamic Server.2000 имеется четыре типа JDBC-драйверов:

Преобразует вызовы JDBC API непосредственно в специфичный для СУБД сетевой протокол без промежуточного ПО. Это позволяет клиентским приложениям подключаться непосредственно к серверу БД, без промежуточного программного обеспечения.

Informix JDBC Driver, входящий в версию, предоставленную для обзора, основан на версии 1.22 JDBC API. Однако следует заметить, что сейчас уже существуют pure-Java драйверы Informix, основанные на Java 2 и соответствующей версии JDBC.

Прекомпилятор SQL для Java (SQLJ)

Informix Embedded SQLJ позволяет вставлять SQL-выражения в Java-программы. Informix Embedded SQLJ состоит из:

Informix SQLJ включает стандартную реализацию SQLJ, определенную консорциумом SQLJ, с добавлением специфичных для Informix расширений.

Чтобы повысить эффективность выполнения и производительность Java UDR и Java-приложений, компания Informix разработала специализированный класс виртуального процессора под названием JVP (Java virtual processor). Виртуальные процессоры Java (JVP) отвечают за выполнение всех программ Java UDR и Java-приложений общего назначения. Процессоры JVP имеют те же возможности, что и виртуальные процессоры ЦП и могут обрабатывать полные запросы SQL. Каждый JVP имеет встроенную в его код виртуальную Java-машину (Java VM). Такая встроенная архитектура VM позволяет из- бежать непроизводительных затрат на передачу связанных с Java запросов между виртуальными процессорами ЦП и Java. Для параллельного выполнения программ Java UDR в одном сервере БД может одновременно существовать несколько JVP.

Расширения

Возможность использовать в запросе внешние источники данных

Informix Dynamic Server.2000 позволяет подключать внешние таблицы собственного формата. Таблицы могут быть расположены на дисках ОС или на ленточном устройстве резервного копирования.

В самом сервере синтаксиса для подключения внешних источников данных не предусмотрено. Имеются низкоуровневые API, но рассмотрение подробностей подключения внешних источников таким способом выходит за рамки данного обзора.

Пользовательские (хранимые) процедуры и пользовательские функции

Informix Dynamic Server.2000 поддерживает создание хранимых процедур и функций на собственном языке, который так и называется — Stored Procedure Language (SPL).

Этот язык поддерживает основные конструкции, присущие языкам структурного программирования: IF, FOR, WHILE и т.п., а также имеет прекрасную интеграцию с SQL-операторами, которые органично вписываются в конструкции SPL. Сам язык не является объектно-ориентированным, но поддерживает работу с объектными расширениями своего сервера.

Вот как выглядит процедура, вставляющая миллион записей в таблицу tmr:

CREATE PROCEDURE TestProc1()
  vEnd int
  DEFINE vCounter int;
  DEFINE vCurrentDate DATE;
  DEFINE vf_int2 int;
  DEFINE vf_vchar1 varchar(100);
  DEFINE vf_dec1 float;
  DEFINE vf_float1 float;
  DEFINE vf_date1 date;

  LET vend = 1000000;
  LET vf_int2 = 0;
  select count(*) into vCounter from tmr;
  LET vf_int2 = 0;
  LET vf_dec1 = 0;
  LET vf_float1 = 0;
  WHILE vCounter < vEnd
    LET vCounter = vCounter + 1;
    LET vf_int2 = vf_int2 + 3;
    LET vf_vchar1 = "Str # " || CAST(vCounter AS VARCHAR(10));
    LET vf_dec1 = vf_dec1 + 0.73;
    LET vf_float1 = vf_float1 + 1235.987654321;
    LET vf_date1 = CURRENT;
    INSERT INTO tmr
             (f_int1,    f_int2,  f_vchar1,  f_dec1,  f_float1,  f_date1)
      VALUES (vCounter, vf_int2, vf_vchar1, vf_dec1, vf_float1, vf_date1);
  END WHILE;
END PROCEDURE;

А так выглядит ее вызов:

EXECUTE PROCEDURE TestProc1 ();

Хранимые функции могут возвращать скалярные значения, наборы скалярных значений и resultset'ы. В Informix Dynamic Server.2000 функции/процедуры, возвращающие resultset'ы, называются "курсорными" (Cursor Functions), а остальные "не курсорными" (Noncursor Functions). Поддерживаются и OUT-параметры.

Ниже приведен пример не курсорной процедуры, возвращающей два целочисленных значения:

CREATE PROCEDURE proc(val int)
  RETURNING int,int;
  RETURN val+10, val+20;
END PROCEDURE;

Идеология возврата resultset'ов в Informix Dynamic Server.2000 схожа с идеологией, принятой в InterBase, а именно: в коде используется специальная конструкция "RETURN ... WITH RESUME". При каждом ее вызове возвращается одна строка resultset'а. При этом данные могут браться как из БД, так и генерироваться программой. Вот пример процедуры, возвращающей последовательность целых чисел от 1 до 10:

CREATE FUNCTION sequence()
  RETURNING INT;
  DEFINE i INT;
  FOR i IN (1 TO 10)
    RETURN i WITH RESUME;
  END FOR
END FUNCTION

Следующий пример показывает, как возвратить данные из таблицы БД:

CREATE FUNCTION birth_date_2(num INTEGER)
  RETURNING VARCHAR(30), DATE;
  DEFINE n VARCHAR(30);
  DEFINE b DATE;
  FOREACH cursor1 FOR
    SELECT name, bdate INTO n, b FROM emp_tab
      WHERE emp_no > num;

    RETURN n, b WITH RESUME;
  END FOREACH
END FUNCTION;

При создании хранимых функций/процедур их исходный текст можно загружать из файлов операционной системы.

Введение новых типов данных и объектные расширения

В этом вопросе Informix Dynamic Server.2000 нет равных. В основном ситуация с введение новых типов данных в Informix Dynamic Server.2000 похожа на ситуацию в Oracle за исключением того что Informix Dynamic Server.2000 поддерживает наследование для составных типов данных (Row). На Рис. 3 представлена схема поддержки сервером Informix различных типов данных.

ris3.gif (4914 bytes)

Рисунок 3.

Встроенные и расширенные типы данных имеют следующие одинаковые характеристики.

Вы можете:

Distinct-типы

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

На мой взгляд, лучшим примером использования Distinct-типов является пример с валютой. В нем для каждой валюты заводится свой Distinct-тип, а для приведения типов создаются специальные функции, учитывающие курс приводимых валют. После этого вы можете присваивать переменной (полю в таблице БД) имеющей тип Dollars (Доллары США) значение, имеющее тип Rurs (Российские рубли) и получать правильный результат (преобразованный по текущему курсу). Такой идиллии на практике обычно не получается, так, в валютном примере все равно придется применять явную функцию преобразования, ибо учетные системы почти никогда не работают с "текущим" курсом, а курс зависит от даты совершения сделки. И все же, даже запрет на присвоение (сравнение) логически несовместимых типов данных может уберечь программиста от ошибок, а значит, ускорить процесс разработки.

Distinct-типы данных могут основываться на одном из следующих исходных типов данных:

Distinct-тип наследует приведение и функции исходных типов, так же как размер и выравнивание, используемое при хранение данных на диске.

Тип Opaque

Хранит пользовательский тип данных с внутренней структурой, недоступной серверу БД. Вы сообщаете серверу БД следующую информацию о этом типе:

Внутренняя структура типа opaque невидима для сервера БД. Доступ к внутренней структуре возможен только через пользовательские функции. Определения opaque-типов хранятся в таблице sysxtdtypes системного каталога.

MULTISET(element_type)

Тип данных MULTISET — тип "список", хранящий неуникальные элементы (допускает повторяющиеся значения). Значения в MULTISET не упорядочиваются. Это означает, что концепции порядкового номера (первого, второго или третьего элемента) в MULTISET не существует.

Все элементы MULTISET имеют одинаковый тип.

Для задания типа элемента используется следующий синтаксис:

MULTISET(element_type NOT NULL)

element_type может быть любого из следующих типов:

Использовать MULTISET можно везде, где используются любые другие типы данных, если не оговорено обратное. Например:

MULTISET нельзя использовать с агрегатными функциями наподобие AVG, MAX, MIN или SUM.

Два MULTISET-а равны, если они содержат одинаковые элементы, даже если элементы имеют различные позиции. Следующие MULTISET-ы не равны:

MULTISET {"blue", "green", "yellow"}
MULTISET {"blue", "green", "yellow", "blue"}

Следующие MULTISET-ы равны.

MULTISET {"blue", "green", "blue", "yellow"}
MULTISET {"blue", "green", "yellow", "blue"}

SET(element_type)

Тип данных SET — тип коллекции, хранящий уникальные элементы и не допускающий дублирования элементов.

Во всем остальном SET аналогичен MULTISET, описанному выше.

Row, Unnamed (неименованная запись)

Тип "неименованная запись" содержит поля, но не имеет определенного пользователем имени. Этот тип определяется по его структуре. Два типа неименованных записей равны, если имеют одинаковую структуру.

Например, следующие неименованные типы записей равны:

ROW (lname char(15), initial char(1) fname char(15))
ROW (dept char(15), rating char(1) name char(15)).

Следующие типы записей неэквивалентны, хотя и имеют одинаковое число полей и одинаковые типы данных, поскольку поля расположены в различном порядке:

ROW (x integer, y varchar(20), z real)
ROW (x integer, z real, y varchar(20))

Неименованная запись может состоять из следующих типов данных:

Тип "неименованная запись" не может быть использован в таблице или в иерархиях наследования типов.

Row, Named (Именованная запись)

Тип "именованная запись" определяется по имени. Имя должно быть уникальным внутри схемы. Именованные записи позволяют использовать наследование типов.

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

Наследование

Типы "именованная запись" могут быть частью иерархии наследования типов. Это значит, что один из типов "именованная запись" может быть родительским (сверхтипом) для другого. Подтип наследует все свойства сверхтипа.

Для реализации наследования используется выражение CREATE ROW TYPE и ключевое слово UNDER. Следующее выражение создает тип employee_t как подтип от типа person_t:

CREATE ROW TYPE employee_t
  (salary NUMERIC(10,2), bonus NUMERIC(10,2))
  UNDER person_t;

Тип employee_t наследует все поля типа person_t и имеет два дополнительных: salary и bonus.

Типизированные таблицы

Таблицы, являющиеся частью иерархии наследования, должны быть типизированными. Типизированные таблицы — это таблицы, которым назначен именованный тип записи.

Приведенные ниже пример использует типы zip_t, address_t и employee_t, которые определяют таблицу employee:

CREATE ROW TYPE zip_t
(
  z_code CHAR(5),
  z_suffix CHAR(4)
)
CREATE ROW TYPE address_t
(
  street VARCHAR(20),
  city VARCHAR(20),
  state CHAR(2),
  zip zip_t
)
CREATE ROW TYPE employee_t
(
  name VARCHAR(30),
  address address_t,
  salary INTEGER
)
CREATE TABLE employee OF TYPE employee_t.

Именованные типы записей zip_t, address_t и employee_t служат шаблонами полей типизированной таблицы employee. Тип employee_t, служащий шаблоном таблицы employee использует тип address_t как тип данных поля адреса. Тип address_t использует тип zip_t как тип поля zip.

Следующий пример показывает, создание таблицы student. Колонка s_address таблицы student определена как неименованная запись. (Колонка s_address могла бы быть также определена и как именованная запись.)

CREATE TABLE student
(
  s_name VARCHAR(30),
  s_address ROW(street VARCHAR (20), city VARCHAR(20),
  state CHAR(2), zip VARCHAR(9)),
  grade_point_avg DECIMAL(3,2)
)

Без сомнения, Informix является лидером среди производителей реляционных БД, пытающихся встроить объектно-ориентированные элементы в свою СУБД. Informix Dynamic Server.2000 — единственный сервер реализующий наследование.

Главной проблемой в объектной ориентации Informix Dynamic Server.2000 является невозможность изменения именованных строк, а значит, и таблиц, на них основанных. Это ситуация переходного периода, и в будущем она изменится. Пока же можно воспользоваться техникой, которая недавно применялась во многих серверах. Создаете временную таблицу, содержащую такие же поля, как и исходная. Копируете в нее данные. Пересоздаете (удаляете таблицу и типы, которые надо изменить, создаете новые типы и таблицу) таблицу с уже измененными типами и копируете в нее необходимые данные из временной таблицы.

В объектно-ориентированной БД от одного типа может быть унаследовано много других типов и создано много объектов, и может оказаться, что пересоздавать придется не одну таблицу, а несколько, и кучу типов. Это сильно усложняет работу, но есть один выход... Отказаться от использования объектно-ориентированных возможностей, по крайней мере до того момента, когда эта технология не обкатается. К тому же за это время подтянутся конкуренты и определятся основные стандарты. По крайней мере, при использовании простых таблиц и колонок таких проблем не возникает.

Модули DataBlade

Модули DataBlade — это программные пакеты, расширяющие функциональность Informix Dynamic Server 2000. Эти пакеты включают SQL-выражения и поддерживающий код, написанный на внешних языках или Informix SPL. Модули DataBlade могут включать и клиентские компоненты.

Модули DataBlade добавляют к БД пользовательские объекты БД, расширяющие синтаксис SQL, и команды, которые можно использовать с сервером Informix. Объект БД — это SQL-сущность,например тип данных, процедура или таблица БД. Сервер Informix  работает с объектами DataBlade как с встроенными объектами. При обработке пользовательских объектов БД он исполняет ассоциированный код, хранящийся в модуле DataBlade.

Расширения сервера делятся на две основные категории:

Informix Dynamic Server.2000 — один из немногих серверов, позволяющих серьезно расширять его функциональность. Приятно, что все необходимые для этого инструменты (DataBlade Development Kit) входят в состав поставки IIF.2000. Нужно все же заметить, что занятие это непростое. Для облегчения понимания разработчиком особенностей программирования DataBlade в состав поставки включены примеры для MS VC++.

В стандартный состав поставки включено два DataBlade, Web Datablade и Техт Datablade.

Создание хранимых процедур и тригеров на стандартных языках

Informix Dynamic Server.2000 не имеет внутренних механизмов для создания (редактирования, компиляции и отладки) хранимых процедур и тригеров на стандартных языках, но зато позволяет использовать внешние процедуры и внешние функции.

Преобразование типов

Приятной особенностью является возможность управления преобразованием типов. Для этого в Informix Dynamic Server.2000 введен специальный оператор CREATE CAST. С помощью этого оператора можно объявить допустимым преобразование одного типа данных в другой, а также задать функцию которая будет выполнение этой операции. В CREATE CAST можно указать, что преобразование должно быть явным, или что оно может быть неявным.

Поддержка внешних процедур и внешних функций

Informix Dynamic Server.2000 поддерживает как внешние процедуры, так и внешние функции. Их можно создавать на языках программирования C или Java.

Создание внешних функций

Пользовательские функции на С создаются так:

  1. Пишете функцию на С.

  2. Компилируете функцию и сохраняете компилированный код в разделяемой библиотеке (разделяемом объектном файле для С).

  3. Регистрируете функцию на сервере БД выражением CREATE FUNCTION.

Пример регистрации пользовательской функции С

Следующий пример регистрирует в БД внешнюю пользовательскую функцию, написанную на языке C с названием equal(). У этой функции есть два аргумента типа basetype1, а возвращает она одно булево значение. EXTERNAL NAME — определяет путь к разделяемой библиотеке, реально содержащей объектный код функции. Эта библиотека содержит функцию basetype1_equal(), написанную на С и вызываемую при исполнении функции equal():

CREATE FUNCTION equal ( arg1 basetype1, arg2 basetype1)
   RETURNING BOOLEAN;
   EXTERNAL NAME
   "/usr/lib/basetype1/lib/libbtype1.so(basetype1_equal)"
   LANGUAGE C
END FUNCTION

Пользовательские функции на Java создаются так:

  1. Напишите статический метод Java. Он может использовать функции JDBC для взаимодействия с сервером БД.

  2. Скомпилируйте исходный Java-код и создайте jar-файл (разделяемый объектный файл Java).

  3. Выполните процедуру install_jar() с выражением EXECUTE PROCEDURE для инсталляции jar-файла в текущую БД.

  4. Если метод использует пользовательские типы, создайте соответствия типов данных SQL и Java-классов.

  5. Зарегистрируйте метод выражением CREATE FUNCTION.

Вместо хранения тела внешней процедуры непосредственно в БД, сервер БД хранит только путь к разделяемому объектному файлу, содержащему компилированный код процедуры. При исполнении внешней процедуры сервером БД вызывается внешний объектный код.

Сервер БД хранит информацию о внешней функции в нескольких таблицах системного каталога.

Пример регистрации пользовательской Java-функции

Следующее выражение CREATE FUNCTION регистрирует пользовательскую функцию sql_explosive_reaction():

CREATE FUNCTION sql_explosive_reaction(int) 
  RETURNS int
  WITH (class="jvp")
  EXTERNAL NAME "course_jar:Chemistry.explosiveReaction"
  LANGUAGE JAVA

Эта функция возвращает одно значение типа INTEGER. Выражение EXTERNAL NAME определяет, что реализация Java-функции sql_explosive_reaction() — это метод с названием explosiveReaction(), являющийся членом Java-класса Chemistry, который находится в jar-файле course_jar.

Создание внешних процедур

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

Отладочные возможности

Informix Dynamic Server.2000 не содержит в поставке никаких современных средств отладки. Единственная возможность — выводить трассировочную информацию в файл ОС. Однако существуют средства независимых разработчиков, созданные именно с этой целью. Например, по сведениям, полученным от представителей Informix одно из таких средств можно найти по адресу www.agsltd.com.

Средства разработки

Informix с самого начала ориентировался на внешних разработчиков. Главным средством разработки издревле был язык C. Для него имеется реализация ESQL (Embedded SQL). ESQL не дает той гибкости, которую дают современные объектно-ориентированные библиотеки доступа к данным, такие, как ADO от Microsoft и OO4O от Oracle. Поэтому мы не будем развивать эту тему.

Informix создал и продает свою основанную на 4GL языке систему разработки — Informix New Era. Она, к сожалению, мало известна на территории бывшего СССР.

Среди сторонних производителей можно выделить Microsoft с его Visual Basic и Visual C++, а так же Inprise/ Borland (который, возможно, скоро станет Corel) со своими Delphi и C++ Builder, хотя что их выделять? На этих средствах разработки можно взаимодействовать практически с любой СУБД.

Поддержка русского языка

Поддержка языков Informix GLS (global language support) соответствует спецификации GLS level 4 — стандарту кодирования, поддерживающему многобайтовые символы. Предлагая поддержку GLS, Informix Dynamic Server 2000 может сравнивать строки символов, печатать даты и воспринимать денежные значения в соответствии с правилами и форматами, принятыми в стране применения продукта. Для этого не требуется каких-то специальных локализованных версий программного обеспечения Informix. Кроме того, GLS обеспечивает поддержку национальных языков в приложениях баз данных, что позволяет переводить приложения на разные языки, сохраняя их функциональность.

Заключение

Informix Dynamic Server.2000 — это мощный, хорошо масштабируемый сервер, имеющий как много достоинств, так и много недостатков. В его достоинства можно зачислить лучшую на сегодняшний день реализацию объектно-ориентированных расширений среди РСУБД, мощный оптимизатор запросов, поддержку множества платформ, распараллеливание выполнения запросов разных пользователей. Одной из самых мощных возможностей Informix Dynamic Server.2000 является возможность расширять функциональность сервера за счет технологии DataBlade. C ее помощью русскими разработчиками в Informix Dynamic Server.2000 добавлена возможность полнотекстового поиска в русскоязычных текстах. DataBlade заслуживает отдельного рассказа, но рамки этой публикации не позволяют этого.

Нам показалась удобной авторизация пользователей в версии для Windows NT. Она осуществляется на уровне операционной системы. Informix Dynamic Server.2000 создает собственную группу, в которую помещает учетную запись первого пользователя — администратора БД с именем informix.

Но вместе с тем это достаточно сложный в администрировании и требующий от администратора серьезной подготовки сервер. Поставляемые с ним средства администрирования нуждаются в доработке и не балуют разнообразием. И совершенно напрасно ранее использовавшиеся и знакомые пользователям средства (IECC, например), не были включены в состав поставки этой версии.

Если в одном месте прибавилось, то в другом обязательно должно убавиться. Так происходит и с Informix Dynamic Server.2000. Переносимость между платформами требует использования универсальных функций работы с памятью (или скрупулезной оптимизации под каждую ОС, а это время...). Любая универсальность приносит в жертву производительность. Видимо этим объясняется меньшая по сравнению с MS SQL Server 7.0, оптимизированным под Win32, производительность при выполнении агрегирующих запросов. Усилия разработчиков в области объектной ориентации, по-видимому, не оставили времени на расширение реляционной подсистемы этого сервера. Так, очень удачная идея Oracle — материализованные view (см. 3-й номер за 1999 г.), реализованная в Oracle 8i и позволяющая значительно ускорить выполнение агрегирующих запросов, выполняемых над очень большими таблицами, отсутствует у Informix Dynamic Server.2000, а ведь даже Microsoft уже встраивает аналогичную функциональность в выходящий в этом году SQL Server 2000.

Мы были сильно удивлены тем, что Informix Dynamic Server.2000 не смог выполнить некоторые наши тестовые запросы. Проблема возникла совершенно неожиданно. Один из агрегирующих запросов содержал вычисления в GROUP BY-части. Если быть конкретней, то этот запрос выглядел так:

SELECT sum(F_DEC1) FROM tmr GROUP BY Mod(F_INT2, 100) ORDER BY 1

Хотя функция Mod прекрасно работала в SELECT-части запроса, но в GROUP BY она работать не хотела. После нескольких экспериментов мы установили, что в GROUP BY-части запроса у Informix вообще нельзя применять каких-либо вычислений. Конечно это не принципиально, но, согласитесь, неприятно.

Однако не все так избалованы, как пользователи Windows. Если вас не пугает более типичный для UNIX или Linux способ конфигурирования сервера, и вы готовы к довольно сложному администрированию ради объектной ориентации и расширяемости, то это — сервер для вас.


Copyright © 1994-2016 ООО "К-Пресс"