суббота, 18 мая 2019 г.

Oracle 18: новые возможности для разработчика

Private Temporary Tables
Private temporary tables удаляются вконце транзакции или сессии. Такие таблицы хранятся в памяти и видимы только внутри одной сессии (аналог mssql временных таблиц).
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_sales_ptt_transaction
    (time_id      DATE,
     amount_sold  NUMBER(10,2))
   ON COMMIT DROP DEFINITION;

User-Defined Sharding Method
LIST и RANGE партиции теперь можно вручнуть положить на нужный шард.
CREATE TABLESPACE ts1 IN SHARDSPACE west;
CREATE TABLESPACE ts2 IN SHARDSPACE central;

CREATE SHARDED TABLE accounts
( id             NUMBER
, account_number NUMBER
, customer_id    NUMBER
, state          VARCHAR(2) NOT NULL
)
PARTITION BY LIST (state)
( PARTITION p_northwest VALUES ('OR', 'WA') TABLESPACE ts1
, PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') TABLESPACE ts2
)
;

Уровни консистенции для запросов к нескольким шардам
Можно установить уровень консистенции для запроса с нескольких шардов.
* STRONG - полная консистенция до SCN (по умолчанию)
* SHARD_LOCAL - консистенция SCN на уровне шарда. Если допустимо, то должно ускорить запрос.
* DELAYED_STANDBY_ALLOWED - возможность забирать данные из STANDBY , где данные могут быть с задержкой

Oracle RAC Sharding
Oracle RAC Sharding может связывать партиции таблицы с инстанциями Oracle RAC. И запрос с указанным ключем партицирования перенаправляется на нужную инстанцию, которая связанна с определенным шардом.

Analytic View FILTER FACT and ADD MEASURE Keywords
Запросы, которые читают аналитические представления, могут включать ключевые слова FILTER FACT для фильтрации данных до любых вычислений и ADD MEASURES для определения дополнительных вычисляемых показателей запроса.
https://docs.oracle.com/en/database/oracle/oracle-database/18/dwhsg/overview-analytic-views.html
https://docs.oracle.com/en/database/oracle/oracle-database/18/dwhsg/analytic-view-objects.html
CREATE OR REPLACE ANALYTIC VIEW sales_av
USING sales_fact
DIMENSION BY
  (time_attr_dim
    KEY month_id REFERENCES month_id
    HIERARCHIES (
      time_hier DEFAULT,
      time_season_hier),
   product_attr_dim
    KEY category_id REFERENCES category_id
    HIERARCHIES (
      product_hier DEFAULT),
   geography_attr_dim
    KEY state_province_id 
    REFERENCES state_province_id
    HIERARCHIES (
      geography_hier DEFAULT)
   )
MEASURES
 (sales FACT sales,
  units FACT units
  )
DEFAULT MEASURE SALES;

SELECT time_hier.member_name, TO_CHAR(sales, '999,999,999,999') AS sales 
  FROM sales_av HIERARCHIES(time_hier)
  WHERE time_hier.level_name = 'YEAR'
  ORDER BY time_hier.hier_order;
  
 MEMBER_NAME          SALES
-----------  -------------
CY2011       6,755,115,981
CY2012       6,901,682,399
CY2013       7,240,938,718
CY2014       7,579,746,353
CY2015       7,941,102,885

SELECT time_hier.member_name, TO_CHAR(sales, '999,999,999,999') AS sales
  FROM ANALYTIC VIEW (                      -- inline analytic view
  USING sales_av HIERARCHIES(time_hier)
  FILTER FACT (time_hier TO level_name = 'MONTH'
               AND TO_CHAR(month_end_date, 'Q') IN (1, 2)
               )
  )
  WHERE time_hier.level_name = 'YEAR')
  ORDER BY time_hier.hier_order;
  
MEMBER_NAME          SALES
-----------  -------------
CY2011       6,755,115,981
CY2012       6,901,682,399
CY2013       7,240,938,718
CY2014       7,579,746,353
CY2015       7,941,102,885

ALTER SYSTEM CANCEL SQL
Отключение SQL запроса без отключения сессии.

Inline External Tables
Возможность читать external данные без создания таблицы:
SELECT * FROM   EXTERNAL (   
    (time_id        DATE NOT NULL,     
     prod_id        INTEGER NOT NULL,
     quantity_sold  NUMBER(10,2),
     amount_sold    NUMBER(10,2))     
    TYPE ORACLE_LOADER     
    DEFAULT DIRECTORY data_dir1
    ACCESS PARAMETERS (
      RECORDS DELIMITED BY NEWLINE
      FIELDS TERMINATED BY '|')     
   LOCATION ('sales_9.csv') REJECT LIMIT UNLIMITED) sales_external;
Также external таблицы теперь можно партицировать
External таблицы теперь можно помещать в In-Memory

Polymorphic Tables
Функция принимает на вход таблицу и возвращает таблицу
Передача таблицы в параметр:
FUNCTION skip_col(tab TABLE, 
чтение данных из функции:
SELECT * FROM noop(emp);
синтаксис

Parallel Partition-Wise SQL Operations
SELECT DISTINCT, Window - теперь могут параллелиться, если идут в по колонке партиции

Modifying the Partitioning
Теперь стратегию партицирования можно менять налету: ALTER TABLE MODIFY PARTITION SQL

Улучшение SQL Tuning Advisor для Exadata
SQL Tuning Advisor получил дополнительные алгоритмы для оптимизации запросов для Oracle Exadata.

Concurrent SQL Execution with SQL Performance Analyzer
Теперь можно имитировать параллельную нагрузку от запросов в tuning set (раньше они всегда выполнялись последовательно)

Automatic In-Memory
Данные в In-Memory используют тепловые карты, статистику колонок и прочее для загрузки или выгрузки данных из Inmem.

Scalable Sequences
В начало последовательности добавляется префикс:
6 digit scalable sequence offset number = 3 digit instance offset number || 3 digit session offset number.
что разбрасывает данные равномерно и решает проблему конкуренции за крайнии блоки индекса.

Memoptimized Rowstore
inmemory k-v хранилище, для быстрого доступа по PK к очень популярным таблицам
ALTER TABLE sh.sales MEMOPTIMIZE FOR READ;
execute DBMS_MEMOPTIMIZE.POPULATE('OE','ORDERS');