2013-07-10

Нововведения в 12с

1. Можно индексировать набор колонок, который уже проиндексирован. Судя по всему сделали для 24х7 при перестройки индексов, например с уникальных на неуникальные.

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


Комментариев нет: