Деякі особливості індексного пошуку в Oracle, Скахін Олексій
Особистий блог. Нотатки про програмування і не тільки
Деякі особливості індексного пошуку в Oracle
1.Навіщо створювати індекси на посилальних полях (FK - foreign key)?
* Очевидно для оптимізації процесів з'єднання таблиць. * Але є й інше, не менш важливе, призначення: Якщо таблиця фактів у схемі «зірка» посилається (FK) на таблицю вимірювань, і на полі посилань немає індексу, то DML (Insert / Update / Delete ) операція над таблицею вимірів заблокує таблицю фактів зміну цілком. Якщо на посилальному полі є індекс, то відбудеться блокування лише потрібних рядків з таблиці фактів, які зачіпають зміну в таблиці вимірювань. Приклад: таблиця з даними продажів (факти) і таблиця касових місць (вимірювання), з деякою періодичністю відбувається зміна списку касових місць, то на полі касове місце / таблиця продажів, бажано створити індекс. Якщо цього не зробити, то дані у продажах будуть заблоковані до commit/rollback оновлення списку касових місць.
2. Compressed index
Стиснення індексів може стати в нагоді, якщо індекс складається з декількох стовпців, кілька перших з яких мало селективні. У цьому випадку при створенні індексу можна вказати: де N - кількість колонок. Приклад: індекс по 3 полях, перші 2 з яких малоселективні (online, status) Індекс без стиснення Індекс зі стиском У цьому випадку група однакових даних N перших колонок будуть стиснуті в один запис в індексі, а ROWID самих записів буде поміщено до допоміжної структури. Зменшення числа аркушів індексу відповідно пришвидшить доступ до даних. Хочу зауважити, що цей спосіб застосовується лише для низько селективних стовпців. Якщо дані достатньоУнікальні, то створення доп. структур на зберігання записів тільки створить додаткові витрати! Так само варто зауважити, що без compressed перший стовпці індексу навпаки повинні містити найбільш селективні дані, щоб Oracle за меншу кількість операцій міг дійти до унікальних даних.
3. Advanced compress - oracle 12
Advanced compress - новий крок розвитку компресії індексів у Oracle 12. Oracle автоматично підбирає розмір компресії на рівні кожного блоку індексу, але порядок стовпців потрібно все також дотримуватися самостійно.
Приклад: 0. Звичайний індекс 1. Індекс із компресією 1 - займає 3200 блоків 2. Індекс з компресією 2 займає 2816 блоків 3. ADVANCED LOW – займає 2816 блоків, тобто. Oracle самостійно підібрав рівень компресії = 2 4. ADVANCED LOW - але спочатку погано стисливий селективний стовпець. Oracle не застосовує компресії, виходить також 3584 блоків. Тобто. за порядком стовпців все також треба стежити, можна тільки не робити analyze index, щоб дізнатися про оптимальний рівень компресії.
Скрипт визначення індексів стиснення зі списком колонок. Формула визначення необхідності стиснення колонки: добуток кількості унікальних значень у поточній та попередніх колонках