ПРИКЛАД ВИКОНАННЯ ОПТИМІЗАЦІЇ

Почнемо виклад з простого прикладу (він вже коротко розглядався в розділі 76 глави 7), що дає представлення про вражаючі результати, яких можна досягти за допомогою оптимізації Розглянемо наступний запит: Визначити імена постачальників деталі з номером Р2. Алгебраїчна запис цього запиту така:

((SP JOIN S) WHERE P # = Р # (Р2)) {SNAME}

Припустимо, що в базі даних міститься інформація про 100 постачальниках і 10 000 поставок деталей, з яких тільки 50 включають партії деталей з номером Р2 Припустимо для простоти, що змінні відносини s і SP зберігаються на диску як два окремо збережених файлу, в кожному записі яких міститься по одному кортежу даних У цьому випадку, якщо система буде обчислювати даний вираз безпосередньо (Тобто взагалі без оптимізації), послідовність виконуваних операцій стає такою, як описано нижче

1 Зєднання змінних відносини SP і S (по атрибуту S #) При виконанні цієї операції буде потрібно вважати інформацію про 10 000 поставок партій деталей і 10 000 разів вважати інформацію про 100 постачальниках (по одному разу для кожної поставки деталей з 10 000) В результаті буде отриманий проміжний набір даних, що містить 10 000 зєднаних кортежів Цей набір даних записується на диск (припустимо, що для розміщення проміжного результату в основний (оперативної) памяті не вистачає місця)

2 Вибірка з отриманого на етапі 1 результату кортежів з даними про деталі з номі ром Р2 На цьому етапі виконується читання 10 000 зєднаних кортежів назад в оперативну память, причому отриманий результат складається тільки з 50 корті жей, які, за нашим припущенням, цілком можуть поміститися в оператив ної памяті

3 Виконання проекції по атрибуту SNAME результату, отриманого на етапі 2 На цьому етапі формується результуючий набір початкового запиту (який складається максимум з 50 кортежів, які цілком можуть бути розміщені в оперативній памяті)

Представлена ​​нижче процедура повністю еквівалентна описаної вище в тому сенсі, що вона обовязково приведе до того ж кінцевого результату, але він буде отриманий більш ефективним способом

1 Вибірка з змінної відносини sp кортежів з даними тільки про деталі з номі ром Р2 На цьому етапі виконується читання 10 000 кортежів і створюється результи рующий набір, що складається тільки з 50 кортежів, який, як ми припускаємо, може поміститися в оперативній памяті

2 Зєднання отриманого на етапі 1 результату із змінною відносини S (по атрибути ту s #) На цьому етапі виконується зчитування даних про всі 100 постачальниках (але тільки один раз, а не по одному разу для кожної поставки партії деталей Р2, так як дані про всіх поставлених партіях деталей з номером Р2 вже знаходять ся в оперативній памяті) Результат містить 50 зєднаних кортежів (які також поміщаються в оперативній памяті)

3 Виконання проекції по атрибуту SNAME результату, отриманого на етапі 2 (Анало гично етапу 3 попередньої послідовності дій) Необхідний результат (не більше 50 кортежів) поміщається в оперативній памяті

У першій з показаних процедур в цілому виконується 1030000 операцій вводавивода кортежів, в той час як у другій процедурі виконується тільки 10100 операцій введення-виведення Отже, цілком очевидно, що якщо прийняти як міри оцінки продуктивності кількість виконаних операцій введення-виведення кортежів, то друга процедура більше ніж у 100 разів ефективніше першого Крім того, цілком зрозуміло, що переважніше реалізувати даний запит саме за допомогою другої процедури, а не першою

Примітка На практиці мірою оцінки продуктивності служить кількість операцій введення-виведення сторінок, а не окремих кортежів, але для спрощення припустимо, що кожен кортеж займає окрему сторінку

Наведений приклад показує, що наслідком навіть незначних змін в алгоритмі реалізації (виконання вибірки, а потім зєднання, замість зєднання

і подальшої вибірки) може бути істотне збільшення продуктивності (в сотні разів) Продуктивність підвищиться ще більше, якщо змінна відносини SP буде індексована або хешірованного по атрибуту Р # У цьому випадку кількість кортежів, зчитувальних на етапі 1 другої процедури, зменшиться з 10 000 всього лише до 50, в результаті чого вся процедура виявиться в 7000 разів ефективніше її початкового варіанту Аналогічно цьому, застосування індексу або хеш-функції для доступу до атрибуту S S #

дозволить зменшити кількість операцій введення-виведення кортежів на етапі 2 з 100 до 50,

в результаті чого процедура обчислення запиту виявиться більш ніж в 10 000 разів ефективніше початкового варіанту Це означає, що якщо на обчислення початкового варіанту реалізації запиту буде потрібно 3:00, то оптимізована версія цього ж запиту буде виконана приблизно за одну секунду До того ж, безумовно, можливі й багато інших покращання

Незважаючи на те, що наведений вище приклад досить простий, він дуже наочно демонструє необхідність використання оптимізації Крім того, він показує ймовірні поліпшення, які можуть застосовуватися на практиці У наступному розділі використовується більш систематичний підхід до вирішення проблеми оптимізації Зокрема, в ньому описано, як загальна проблема може бути розділена на послідовність з кількох більш-менш незалежних підзадач Це дозволить нам перейти до розгляду окремих стратегій і прийомів оптимізації, обговорюваних в наступних розділах

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*