Oracle різні замітки, Скахін Олексій

Особистий блог. Нотатки про програмування і не тільки

Oracle: різні нотатки

Невелика рубрика з нотатками щодо Oracle за кінець 2015 року, кожної з яких окремо недостатньо для повної статті.

  • Row SCN
  • Зміщення high water mark
  • Можливі pragma у pl-sql
  • Рандомний доступ до даних
  • _optimizer_max_permutations - максимальна кількість перестановок для оптимального плану
  • attribute clustering та zone map (Oracle 12)
  • Oracle in-memory (Oracle 12)
  • insert all
  • Партиціювання без Oracle Enterprise
  • Перетворений sql (oracle 12)
  • keep pool: таблиця завжди буде в кеші
  • PIPE-line функції
  • over RANGE fn(t_timekey) PRECEDING
  • partition join outer
  • Типи блокувань
  • Види ізоляцій в oracle
Row SCNhttps://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns007.htm Цікавий спосіб виявлення змін в ічтоніці без застосування тригерів/ cdc/golden gate. При включеному flash back recovery у кожного рядка таблиці зберігається номер SCN, який оновлюється при update/insert. Зберігаючи його можна витягнути з джерела зміни за певний період.Мінус:* SCN зберігається для блоку, тобто. якщо блок міститься більше 1 рядка, то вибірку потраплять зайві дані. * не виявити видалені рядки

Зміщення high water mark/*+append*/ - збільшує HWM на розмір вставки (навіть якщо вільне місце є) delete не зміщує HWM Назад донизу, що може суттєво збільшити час читання навіть невеликий таблиці з диска. Зміщуємо назад: * ALTER TABLE имя_таблицы SHRINK SPACE [COMPACT] [CASCADE]; має бути включено ENABLE ROW MOVE натаблиці, т.к. дані переносяться фізично * truncate table

Можливі pragma в pl-sql* автономна транзакція: PRAGMA AUTONOMOUS_TRANSACTION * ініціалізація exception: PRAGMA EXCEPTION_INIT * скидання змінних сесії за замовчуванням: PRAGMA SERIALLY_REUSABLE <6 PRAGMA INLINE * рівні строгості функції: RESTRICT_REFERENCES

Останній пункт дозволяє вирішити проблему: при додаванні функції до запиту, він перестає паралелиться Запит з функцією може паралелиться, якщо рівень суворості функції встановлено константний: http://docs.oracle.com/cd/B28359_01/appdev .111/b28370/restrictreferences_pragma.htm RESTRICT_REFERENCES * RNDS - не читає бд * WNDS - не пише в бд * RNPS - не читає змінні пакети

Рандомний доступ до даних* отримати 0,01% рандомних записів з таблиці: SELECT * FROM src_ship sample (0.01) * приблизний count SELECT COUNT(*) * 1000 FROM деякий SAMPLE (0.1);

_optimizer_max_permutations- максимальна кількість перестановок для оптимального плану При великій кількості таблиць в join проявляється важливість правильно виставлення послідовності їх у запиті, т.к. вже за 15 таблицях потрібно перебрати 1 трлн можливих перестановок таблиць (15!). Що насправді ніколи не буде досягнуто, т.к. 80000 - максимальне значення (9 таблиць) Так що першому плані виходить: * Збереження оптимальних планів. * Машинне навчання, заміна повного перебору * Ручне хінтування та правильно вибудовування таблиць у запитах

attribute clustering і zone map (Oracle 12)* attribute clustering - коли пов'язані дані лежать поряд на диску (які дані повинні лежати поряд вказується при створенні таблиці, також правила можутьвстановлювати пов'язані таблиці) * zone map - аналог index, але він рядковий, а, по групі рядків. Самостійний опис розподілу даних у клініці для exadata.

Oracle in-memory* колонкове зберігання таблиць, як наслідок швидкий доступ до частини стовпців при ful table scan. * відмінності в ступенях стиснення (for dml - частий доступ /query low - звичайний доступ, capacity high - рідкісний доступ) * окрему партицію можна зробити inmemory * різниця у швидкості вставки в колонкову таблицю та у звичайну (за умови відсутності індексів) * перевага лише швидкості читання з диска (і фільтра), тобто. join/агрегація/сортування і т.д. працюватиме також

insert allпрацює повільніше, ніж послідовні insert, т.к. дані вставляють рядково, а не всі відразу (executions в статистиці)

розгорнутий sql (oracle 12)Наповнити результуючий перетворений sql запит без обробки подій: dbms_sql2.expand_sql_text(m_sql_in, m_sql_out);

keep pool: таблиця завжди буде в кешіalter table etl_abonent storage (BUFFER_POOL KEEP); alter table etl_abonent cache;

PIPE-line функціїhttps://oracle-base.com/articles/misc/pipelined-table-functions Функція повертає табличні дані, переваги перед звичайним курсором: * дані повертаються в міру вибірки рядково, що знижує споживання pga і не слід чекати повного виконання (мало значимо, якщо потрібне сортування над результуючим запитом) * можна паралерит всередині іншого запиту, на відміну від курсорів (треба вказувати під час створення функції за яким стовпцем можна паралелити) * можна задавати кардинальність, інакше за замовчуванням = 0 (у курсорів тільки хінтом)

over RANGE fn (t_timekey) PRECEDINGрозмір вікна можна задавати функцією, а не лише строго числом у скрипті

partition join outer* потрібен для витягування фактів по 2 незв'язаних вимірах, включаючи всі дані цих 2 вимірів ** спочатку робиться left join 1го виміру з фактом, потім parition join і right join другого виміру

Види ізоляцій в oracle* read commited - є фантомні читання, * serializble - послідовний доступ, * read only - те саме, що serializble, але без прав запису