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

Post on 22-May-2015

4.867 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

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

FIREBIRD 2.1

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

Хорсун Владислав hvlad@users.sourceforge.net

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

top related