2. Появились колонки с автоинкрементом (Identity Columns). Можно указывать, когда вставлять значения:
GENERATED ALWAYS AS IDENTITY -- колонку вообще нельзя указывать в списке полей для INSERT
GENERATED BY DEFAULT AS IDENTITY -- колонку можно использовать в списке INSERT, вставится указанное значение, если оно не NULL (в этом случае будет сообщение об ошибке) GENERATED BY DEFAULT ON NULL AS IDENTITY -- колонку можно использовать в списке INSERT. Если указан NULL, то будет выбран следующий номер Identity Columns имеют ограничение NOT NULL. Работает быстрее триггеров. Подробнее
3. Возможность задавать в таблице значения по-умолчанию из sequence.nextval и sequence.currval (для вставки master-detail). Значения по умолчанию могут вставляться в случае, если в insert просто не указана колонка (DEFAULT) и в случае NULL значения (DEFAULT ON NULL). Подробнее
Вообще появилась возможность делать значения по-умолчанию в случае, если мы явно вставляем NULL в колонку.
Старое поведение, вставили NULL - получили NULL:
DROP TABLE def;
CREATE TABLE def(a VARCHAR2(50), b VARCHAR2(10) DEFAULT 'x');
insert into def(a) values('a only');
insert into def(a, b) values('a, null', NULL);
SELECT * FROM def;
A B
-------------------------------------------------- ----------
a only x
a, null
Новая возможность -- NULL вставляется и при явном указании в INSERT NULL
DROP TABLE def;
CREATE TABLE def(a VARCHAR2(50), b VARCHAR2(10) DEFAULT ON NULL 'x');
insert into def(a) values('a only');
insert into def(a, b) values('a, null', NULL);
SELECT * FROM def;
A B
-------------------------------------------------- ----------
a only x
a, null x
4. invisible columns. Пока применения найти не удается http://tkyte.blogspot.com/2013/07/12c-silly-little-trick-with-invisibility.html
5. Возможность посмотреть полный текст SQL запроса при помощи dbms_utility.expand_sql_text с раскрытыми представлениями, правилами VPD. Можно использовать при запросах к V$ вьюхам http://tkyte.blogspot.com/2013/07/12c-sql-text-expansion.html
6. UTL_CALL_STACK -- новое формирование стека вызова. Подробнее
7. В Oracle 11 при добавлении колонки NOT NULL с указаным значением по умолчанию DEFAULT не вызывал изменения блоков таблицы, изменяя только метаданные. В Oracle 12 при добавлении любой (т.е. и NULL колонки) с указанным DEFAULT не вызывают изменения данных и поэтому стоят очень дешево. Подробнее в разделе Metadata-Only DEFAULT Values
8. Админская штучка: в один поток ОС можно засунуть несколько сессий Oracle. Полезно, если на сервере поднята куча инстансов. Подробнее
9. В With можно писать функции и процедуры на PL/SQL. Подробнее Так же функции можно создавать с PRAGMA UDF, такие функции нельзя использовать из pl/sql, но они быстро работают в sql
10. Появилась возможность постраничной выборки в SQL, например OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY. Подробнее
11. После CTAS и INSERT ... SELECT в пустую таблицу статистика собирается автоматически
12. Для табличных партиций и сабпартиций теперь можно указывать, создавать ли local индексы. Подробнее
Для глобальных индексов в партиционированных таблицах возможно удаление партиции без удаления индекса (об этом много написано у Richard Foot).
13. В SQL из PL/SQL можно использовать новые типы данных. Подробнее
14. Теперь можно грантовать пакеты, процедуры и функции другим пакетам. Такие пакеты невозможно будет вызвать из-вне. Пример
Так же можно делать GRANT TO program_unit. Сделано для того, что бы пользователю, вызывающему пакет с invoker rights не давать лишних привелегий. Подробнее
Вообще в этой версии с привелегиями достаточно много новых штук сделали.
15. Если поставить MAX_STRING_SIZE = extended, то SQL сможет использовать VARCHAR2 размером 32767.
16. Можно использовать конструкцию LATERAL, которая позволяет использовать в последующих подзапросах FROM результаты предыдущих подзапросов
SELECT a.object_name, b.object_type
FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a,
lateral(SELECT o.object_type FROM all_objects o WHERE o.object_id = a.object_id) b
I_OBJ1 INDEX
CLU$ TABLE
I_COL3 INDEX
I_UNDO1 INDEX
I_CDEF4 INDEX
BOOTSTRAP$ TABLE
FILE$ TABLE
I_CCOL2 INDEX
I_FILE#_BLOCK# INDEX
C_USER# CLUSTER
То же самое можно сделать при помощи CROSS APPLY
SELECT a.object_name, b.object_type
FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a CROSS APPLY (SELECT o.object_type FROM all_objects o WHERE o.object_id = a.object_id) b
I_OBJ1 INDEX
CLU$ TABLE
I_COL3 INDEX
I_UNDO1 INDEX
I_CDEF4 INDEX
BOOTSTRAP$ TABLE
FILE$ TABLE
I_CCOL2 INDEX
I_FILE#_BLOCK# INDEX
C_USER# CLUSTER
Конструкция OUTER APPLY помогает сделать похожий OUTER JOIN
SELECT a.object_name, a.object_type, b.tablespace_name
FROM (SELECT * FROM All_Objects WHERE ROWNUM <= 10) a OUTER APPLY
(SELECT o.tablespace_name FROM all_tables o WHERE o.table_name = a.object_name) b
CLU$ TABLE SYSTEM
FILE$ TABLE SYSTEM
BOOTSTRAP$ TABLE SYSTEM
I_OBJ1 INDEX
C_USER# CLUSTER
I_UNDO1 INDEX
I_FILE#_BLOCK# INDEX
I_COL3 INDEX
I_CDEF4 INDEX
I_CCOL2 INDEX
17. Можно перемещать файлы данных не выводя их в offline
18. Не смотрел подробнее: новый вид обновления материализованных представлений synchronous refresh
19. Новый способ проверить, есть ли у пользователя роль -- sys_context SYS_SESSION_ROLES:
SELECT sys_context('SYS_SESSION_ROLES', 'DBA') FROM dual;
TRUE
SELECT sys_context('SYS_SESSION_ROLES', 'DBA2') FROM dual;
FALSE
20. Теперь планы могут меняться во время выполнения запроса. Сравнивая статистику. используемую при построени плана с реальным выполнением оптимизатор может на лету поменять, например, NESTED LOOPS на HASH JOIN.
21. Новые виды гистограмм для колонок с более чем 254 значениями.
Top frequency histograms -- если большинство значений (99%) в колонке приходятся на несколько значений. Гистограмма строится только по этим популярным значениям, непопулярные отбрасываются
Hybrid histogram -- height-based histogram в которых популярные значения попадают в табличку и одно и тоже значение не попадает более чем 1 раз
22. Статистика для GTT своя в каждой сессии.
23. Статистика, собранная dynamic sampling и adaptive cursor plan сохраняется в словаре (в предыдущих версиях хранилась в cursor cache)
24. Клонировать RMAN можно с базы-копии.
25. В RMAN можно просто без указания конструкции SQL выполнять SQL команды и даже запросы.
26. RMAN умеет восстанавливать отдельную таблицу или группу таблиц.
27. Temporal Validity. Документация. Кайт. Штука, которая позволяет в таблице указывать колонки, в которых хранятся сроки начала и окончания действия записи. Для получения актуальной на дату записи пользоваться в запросом с конструкцией AS OF PERIOD FOR или пакетом DBMS_FLASHBACK_ARCHIVE.
Хотел протестировать эту штуку, да она не заработала. Потом нашел у Кайта
this feature currently is not supported/working with the pluggable database infrastructure. This is a temporary limitation
Комментариев нет:
Отправить комментарий