Новые возможности firebird 2.1 (in russian, vlad khorsun)

14
Первая российская конференция по СУБД Firebird и InterBase FIREBIRD 2.1 Новая версия Новые возможности Хорсун Владислав [email protected]

Upload: nataly-polyanskaya

Post on 22-May-2015

4.866 views

Category:

Technology


0 download

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 them

TRANSCRIPT

Page 1: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД Firebird и InterBase

FIREBIRD 2.1

Новая версияНовые возможности

Хорсун Владислав [email protected]

Page 2: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД Firebird и InterBase

FIREBIRD 2.1• GLOBAL TEMPORARY TABLE

Глобальные временные таблицы

• COMMON TABLE EXPRESSIONS Сложные и рекурсивные запросы ? Это просто !

• TYPE OFДомены в процедурах, триггерах и CAST

• REPLACE, MERGEВставка или изменение ? Пусть сервер решает сам ;)

Page 3: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД Firebird и InterBase

GLOBAL TEMPORARY TABLE

• Стандартные свойства• Общие метаданные• Раздельные данные• Индексы, триггеры, контроль уникальности и

ссылочной целостности• Время жизни – соединение или транзакция

• Специфика Firebird• Нет проблем со сборкой мусора• Хранение вне файла БД, forced writes off

Page 4: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД Firebird и InterBase

GLOBAL TEMPORARY TABLE

• Синтаксис• CREATE GLOBAL TEMPORARY TABLE

…[ON COMMIT <DELETE | PRESERVE> ROWS]

• ON COMMIT DELETE ROWSвремя жизни данных - транзакция

• ON COMMIT PRESERVE ROWSвремя жизни данных - соединение

• По умолчанию - DELETE

Page 5: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД Firebird и InterBase

master

detailpersistent

on commit preserve rows

on commit delete rows

persistent ь

on commit preserve rows ь

on commit delete rows ь ь

Правила ссылочной целостности

GLOBAL TEMPORARY TABLE

Page 6: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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

страницы не выделены

Общие метаданные Раздельные данные

Page 7: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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 …

Простые не рекурсивные табличные выражения

Page 8: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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 не должны иметьциклов

Page 9: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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• Рекурсивная ссылка не должна быть членом внешнего объединения

Page 10: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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

Page 11: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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

)

Page 12: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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.

• Сохраняются зависимости доменов от процедур\триггеров

• При изменении домена процедуры не перекомпилируются сервером

• Зависимые от домена объекты ‘почувствуют’ изменение домена при загрузке в кеш метаданных

Page 13: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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 должно соответствовать не более одной записи

Page 14: Новые возможности Firebird 2.1 (in Russian, Vlad Khorsun)

Первая российская конференция по СУБД 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)