Новые возможности firebird 2.1 (in russian, vlad khorsun)
DESCRIPTION
PPT in Russian by Vlad Khorsun, core Firebird developer. Presentation is devoted to the set of new features in Firebird 2.1. Though now we have 2.5 is going to be released, it is still interesting, since many people still have 1.5 or 2.0, so 2.5 will be big move for themTRANSCRIPT
Первая российская конференция по СУБД Firebird и InterBase
FIREBIRD 2.1
Новая версияНовые возможности
Хорсун Владислав [email protected]
Первая российская конференция по СУБД Firebird и InterBase
FIREBIRD 2.1• GLOBAL TEMPORARY TABLE
Глобальные временные таблицы
• COMMON TABLE EXPRESSIONS Сложные и рекурсивные запросы ? Это просто !
• TYPE OFДомены в процедурах, триггерах и CAST
• REPLACE, MERGEВставка или изменение ? Пусть сервер решает сам ;)
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
• Стандартные свойства• Общие метаданные• Раздельные данные• Индексы, триггеры, контроль уникальности и
ссылочной целостности• Время жизни – соединение или транзакция
• Специфика Firebird• Нет проблем со сборкой мусора• Хранение вне файла БД, forced writes off
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
• Синтаксис• CREATE GLOBAL TEMPORARY TABLE
…[ON COMMIT <DELETE | PRESERVE> ROWS]
• ON COMMIT DELETE ROWSвремя жизни данных - транзакция
• ON COMMIT PRESERVE ROWSвремя жизни данных - соединение
• По умолчанию - DELETE
Первая российская конференция по СУБД Firebird и InterBase
master
detailpersistent
on commit preserve rows
on commit delete rows
persistent ь
on commit preserve rows ь
on commit delete rows ь ь
Правила ссылочной целостности
GLOBAL TEMPORARY TABLE
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
database
CREATE GLOBAL TEMPORARY TABLE T1
session 1
session 2
страницы не выделены
страницы не выделены
страницы выделены (временный
файл1, FW = OFF)
страницы освобождены (временный файл
удалён)
INSERT INTO T1 SELECT FROM T1
страницы выделены
disconnect
страницы освобождены (временный файл
удалён)
INSERT INTO T1SELECT FROM T1
страницы выделены (временный
файл2, FW = OFF)
disconnect
страницы не выделены
Общие метаданные Раздельные данные
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONS
WITH -- новое ключевое слово WITH
CTE_A -- имя первого табличного выражения[(a1, a2, …)] -- алиасы полей, необязательные
AS ( SELECT … ), -- определение выражения
CTE_B [(b1, b2, …)] -- второе табличноеAS ( SELECT … ), -- выражение
…
SELECT … -- основной запрос, использующийFROM CTE_A, CTE_B, -- табличные выражения
TAB1, TAB2 -- и обычные таблицы WHERE …
Простые не рекурсивные табличные выражения
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры простых табличных выражений
WITH
A AS (SELECT … FROM T1),
B AS (SELECT … FROM A),
C AS (SELECT … FROM A, B B1, B B2),
D AS (SELECT … FROM E),
E AS (SELECT … FROM D),
F AS (WITH …)
• Выражений может быть несколько• В выражении можно использовать
любые конструкции синтаксиса SELECT
• Они могут ссылаться друг на друга• Их можно использовать в любой
части запроса• Их можно использовать в одном запросе несколько раз• Их можно использовать с любым
DML запросом : INSERT, UPDATE, DELETE, SELECT
• Их можно использовать в PSQL : FOR WITH … SELECT …
• Операторы WITH не могут бытьвложенными
• Ссылки между CTE не должны иметьциклов
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONS
WITH RECURSIVE -- новое ключевое слово RECURSIVECTE_R AS ( SELECT … FROM T1 -- не рекурсивный член
UNION ALL -- обязательно ALL
SELECT … -- рекурсивный членFROM CTE_R -- рекурсивная ссылка
)… -- другие выражения
SELECT … -- основной запросFROM CTE_R …
WHERE …
Рекурсивные табличные выражения
• CTE может ссылаться на само на себя• Рекурсивное выражение – это объединение рекурсивных и не рекурсивных членов• Обязательно должен быть не рекурсивный член• Сначала перечисляются не рекурсивные члены • Рекурсивные члены отделяются друг от друга с помощью UNION ALL
• По-прежнему не допускаются циклические ссылки• Рекурсивные члены не могут использовать агрегатные функции, DISTINCT, GROUP BY, HAVING• Рекурсивный член может содержать ровно одну рекурсивную ссылку и только во FROM• Рекурсивная ссылка не должна быть членом внешнего объединения
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры рекурсивных табличных выражений
WITH RECURSIVER_TREE (ID, LEVEL) AS ( SELECT ID, 0 FROM TREE
WHERE PARENT_ID IS NULL
UNION ALL
SELECT TREE.ID, R_TREE.LEVEL + 1FROM TREE, R_TREE
WHERE TREE.PARENT_ID = R_TREE.ID)
SELECT TREE.*, R_TREE.LEVELFROM TREE, R_TREE
WHERE TREE.ID = R_TREE.ID
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры рекурсивных табличных выражений
WITH RECURSIVER AS (
SELECT PEOPLE, FATHER, MOTHERFROM PEOPLES
WHERE NAME = ‘VLAD’
UNION ALL
SELECT F.PEOPLE_ID, F.FATHER, F.MOTHER FROM PEOPLES F, R WHERE F.PEOPLE_ID = R.FATHER
UNION ALL
SELECT M.PEOPLE_ID, M.FATHER, M.MOTHER FROM PEOPLES M, R WHERE M.PEOPLE_ID = R. MOTHER
)
SELECT * FROM R
CREATE TABLE PEOPLES ( PEOPLE_ID INT NOT NULL PRIMARY KEY,
NAMEVARCHAR(255),FATHERINT REFERENCES PEOPLES,MOTHERINT REFERENCES PEOPLES
)
Первая российская конференция по СУБД Firebird и InterBase
Домены в параметрах процедур, в переменных и в CAST
CREATE DOMAIN D_MONEY AS NUMERIC (12, 4);
CREATE TABLE T (ID INT, AMOUNT D_MONEY);
CREATE PROCEDURE PROC1 (I1 TYPE OF D_MONEY)RETURNS (O1 TYPE OF D_MONEY)
ASDECLARE V_SUM TYPE OF D_MONEY;BEGINV_SUM = I1;O1 = V_SUM;SUSPEND;
END;
SELECT CAST(1 AS TYPE OF D_MONEY) FROM RDB$DATABASE;
ALTER DOMAIN D_MONEY TYPE NUMERIC (18, 4);
• Из определения домена используется только тип данных, ограничения (CHECK, NOT NULL) не используются. Чтобы подчеркнуть этот факт введено TYPE OF.
• Сохраняются зависимости доменов от процедур\триггеров
• При изменении домена процедуры не перекомпилируются сервером
• Зависимые от домена объекты ‘почувствуют’ изменение домена при загрузке в кеш метаданных
Первая российская конференция по СУБД Firebird и InterBase
REPLACE
REPLACE INTO <table> [(col1, …, colN)]
VALUES (val1, …, valN)
[MATCHING (mcol1, …, mcolM)]
[RETURNING (val1, …, valR) [INTO :var1, …, :varR]]
INSERT или UPDATE ?
IF EXISTS(SELECT * FROM <table> WHERE mc1 = val1 AND … AND mcM = valM)THEN UPDATE <table> SET col1 = val1, … colN = valN
WHERE mc1 = val1 AND … AND mcM = valM)ELSE INSERT INTO <table> [(col1, …, colN)]
VALUES (val1, …, valN)
REPLACE - два в одном !
• Если MATCHING не задан, то для поиска совпадения используется первичный ключ, который обязательно должен быть определён
• Требуются права доступа и на INSERT, и на UPDATE
• При использовании RETURNING, условию MATCHING должно соответствовать не более одной записи
Первая российская конференция по СУБД Firebird и InterBase
MERGE
MERGE INTO <table> -- новое ключевое слово MERGEUSING <table_or_join> -- источник данных для вставки\обновленияON <search_condition> -- условие поиска обновляемой строки-- запрос для обновления[WHEN MATCHED THEN UPDATE SET col1 = val1, … , colN = valN]-- запрос для вставки[WHEN NOT MATCHED THEN INSERT [col1, …, colN] VALUES (val1, …, valN)]
REPLACE – это хорошо, но если данные в другой таблице ?
MERGE INTO AMOUNTS USING ENTRIES E ON AMOUNTS.GOODID = E.GOODID AND AMOUNTS.DT = E.DTWHEN MATCHED THEN UPDATE SET SUMMA = SUMMA + E.DBT - E.CRDWHEN NOT MATCHED THEN INSERT (GOODID, DT, SUMMA) VALUES (E.GOODID, E.DT, E.DBT - E.CRD)