Чтение онлайн

на главную - закладки

Жанры

Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil

Востриков С М

Шрифт:

Добавлены новые встроенные функции - CASE, COALESCE и NULLIF (все они являются частью SQL-стандарта). CASE является базовой для этого ряда функций и реализует условную выборку значений из списка, например:

SELECT CASE WHEN (О.TYPE = 0) THEN 'Доход' ELSE 'Расход' END FROM OPERATIONS 0

или так:

SELECT CASE 0.TYPE WHEN 0 THEN 'Доход' ELSE 'Расход' END FROM OPERATIONS 0

Стоит отметить, что у функции CASE может быть любое количество аргументов, т. е. она не ограничивается только простейшей проверкой типа "ЕСЛИ- ИНАЧЕ", например:

SELECT CASE

О.TYPE WHEN О THEN 'Доход' WHEN 1 THEN 'Расход'

ELSE '---' END

FOM OPEPATIONS O<

Функция COALESCE является упрощением CASE для проверки на NULL, например:

SELECT COALESCE(0. STATUS, '---')

FROM OPERATIONS O

Результатом COALESCE будет являться первый аргумент, если он не NULL, или второй аргумент в противном случае. Функция NULLIF также является упрощением CASE, но для немного другого случая:

SELECT NULLIF(О.STATUS1, О.STATUS2)

FROM OPERATIONS O

Результатом NULLIF будет являться NULL, если оба аргумента равны, или первый аргумент в противном случае.

Кроме встроенных функций, добавлены также новые системные переменные:

* CONNECTION_ID - идентификатор текущего соединения; " TRANSACTION_ID - идентификатор текущей транзакции;

* ROWS_AFFECTED - количество записей, затронутых (т. е. добавленных, исправленных или удаленных) последним выполненным оператором;

* GDSCODE и SQLCODE - соответствующие коды исключений, перехваченных в блоках WHEN.

Переменные CONNECTION_ID и TRANSACTION_ID доступны во всех вариантах SQL, в то время как ROWS_AFFECTED, GDSCODE и SQLCODE - только в PSQL (т. е. в хранимых процедурах и триггерах). Клиентское приложение может получить значения упомянутых системных идентификаторов (CONNECTIONJDD и TRANSACTIONJD) через запрос, аналогичный следующему:

SELECT TRANSACTION_ID FROM RDB$DATABASE;

Также расширены возможности работы с исключениями в хранимых процедурах и триггерах с помощью команды EXCEPTION:

* EXCEPTION (без параметров) - заново инициирует перехваченное в WHEN-блоке исключение;

* EXCEPTION <name> <msg> - инициирует исключение с текстом, определяемым выражением msg.

Еще одним важным нововведением является поддержка точек сохранения (savepoints), действующих внутри транзакции. Этот стандартный механизм позволяет откатить не всю транзакцию, а только часть ее, выполненную после указанной точки сохранения. Для этого используются следующие SQL-команды:

SAVhPOINT <name>

и

ROLLBACK [WORK] TO [SAVEPOINT] <name>.

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

Помимо всего перечисленного, интерес может представлять и возможность динамического выполнения SQL-выражений в хранимых процедурах и триггерах. Для этого используется новая команда EXECUTE STATEMENT <stmt>, где единственным параметром является строка, содержащая выполняемое SQL-выражение. Например:

stmt_var = 'update my_table set flag = 0 where parent_id = ' ||

cast (:param as varchar(10));

EXECUTE STATEMENT stmt_var;

Этим

новые возможности в SQL не ограничиваются, но их описание выходит за рамки данной i лавы.

Расширение механизма событий

Механизм оповещения о событиях (event alerters) является способом асинхронной передачи информации с сервера клиенту. Для этого клиент регистрирует свой интерес в конкретных именованных событиях и переходит в режим ожидания оповещений от сервера, который посылает ему их с помощью команды POST_EVENT, доступной в хранимых процедурах и триггерах. События посылаются сервером не сразу, а в момент подтверждения транзакции. При этом каждое событие имеет внутренний счетчик инициации, т. е. если в течение транзакции команда POST_EVENT для данного события была вызвана несколько раз, то клиенту будет доставлено оповещение только однажды, но его счетчик будет содержать количество инициации. Для работы с событиями на клиентской стороне используются следующие функции API: isc_event_block, isc_que_events, isc_wait_for_ event и isc_event_counts.

Ho полному использованию этого механизма мешала фиксация имени события, т. е. клиент всегда должен ожидать событие с точно таким именем, которое инициирует сервер, а также невозможность передать параметры вместе с событием. В новой версии Firebird механизм событий был расширен возможностью обработки так называемых параметризованных событий, когда каждое инициируемое событие может иметь аргумент, который будет передан на клиентскую сторону вместе с событием. Тогда сервер может инициировать событие следующим образом (например, в триггере):

POST_EVENT 'MY_EVENT', NEW.OPER_TYPE || '_ID=' | CAST(NEW.ID AS VARCHAR(IO));

Для получения списка аргументов событий с их собственными счетчиками инициации была введена новая функция API: isc_event_params.

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

Производительность

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

Был улучшен алгоритм работы оптимизатора запросов, в частности в следующих направлениях:

* использование индексов в подзапросах с агрегатами,

* игнорирование "плохих" индексов, т. е. индексов, использование которых может привести лишь к замедлению выполнения запроса;

* более качественный анализ селективности индексов при построении плана;

* оптимальное построение плана в случае доступности одно- и многосегментных индексов;

* более совершенное использование индексов в условиях типа "OR", особенно в случае сложных предикатов (в частности, сложных неявных соединений).

Поделиться:
Популярные книги

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Лисья нора

Сакавич Нора
1. Всё ради игры
Фантастика:
боевая фантастика
8.80
рейтинг книги
Лисья нора

Калибр Личности 5

Голд Джон
5. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 5

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Повелитель механического легиона. Том VII

Лисицин Евгений
7. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VII

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3