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
Зміщення 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, але без прав запису