1 Тб база даних Firebird: попередній звіт
Дмитро Кузьменко, останнє оновлення 31-03-2014
Переклади цього документа: Португальською Російською Китайською
Прочитайте нашу статтю про ще більшу (1,7 терабайта) базу даних: Більше деталей про базу даних Firebird SQL об’ємом 1,7 терабайта.
Навіщо створювати терабайтну базу даних Firebird?
Багато компаній працюють з великими базами даних Firebird і покладаються на них для підтримки важливих бізнес-операцій. Деякі з баз даних Firebird вже мають сотні гігабайт і продовжують зростати (див. розділ «Хто великий?»), і легко передбачити момент, коли вони стануть у 2, 3 або 5 разів більшими. Тому адміністратори баз даних і постачальники зацікавлені в дослідженні поведінки Firebird з великими базами даних та отриманні рекомендацій щодо їх управління.
Також важливою причиною, яку ми мали на увазі під час створення бази даних Firebird об’ємом 1 ТБ, було остаточне усунення поширеного сприйняття Firebird як рушія баз даних для «малих баз даних». Цей міф, здається, уже мертвий, але деякі аналітики та журналісти регулярно піднімають його з могили, і ми сподіваємося нарешті покінчити з цим безглуздим сприйняттям.
| ## Апаратне забезпечення |
Firebird відомий своєю неймовірною масштабованістю, і це дослідження підтвердило це ще раз. Початковою метою цього експерименту було просто створення бази даних Firebird розміром 1 ТБ, тому ми використовували звичайний настільний комп’ютер:
Таблиця 1: Апаратне забезпечення
| Компонент | Параметри |
| CPU | AMDAthlon 64 x2 5200 |
| RAM | 4GB |
| Материнська плата | MSI K9N Platinum |
| HDD1 (операційна система та тимчасові файли) | ST3160815AS, 160GB, SATA II |
| HDD2 (допоміжний) | HDT721064SLA360, 640GB,SATAII |
| HDD2 (допоміжний) | HDS728080PLA380, 80GB, SATA I |
| HDD3 (база даних) | ST31500341AS, 1.5TB, SATA II (Firmware CC1H) |
По суті, ми встановили жорсткий диск 1,5 ТБ в один із наших офісних настільних комп’ютерів без будь-яких інших модифікацій. Цей жорсткий диск було відформатовано з розміром кластера 16 КБ (тим самим, що й розмір сторінки бази даних, як ви можете побачити нижче).
Програмне забезпечення
Оскільки це настільний комп’ютер, операційна система - Windows XP Professional SP3, 32-бітна. Для фактичного виконання тесту ми використовували завантажувач із набору інструментів на основі TPC (завантажте його з http://ibdeveloper.com/tests/tpc-c/, доступні як бінарні файли, так і вихідні коди).
Ми хочемо підкреслити, що завантажувач вставляє дані так, як вони вставлялися б у реальному сценарії: записи вставляються та розміщуються всередині бази даних (і на фізичних областях диска) у кількох таблицях master-detail-subdetail, а не таблиця за таблицею.
Таблиця 2: Програмне забезпечення
| Програмне забезпечення | Версія |
| Операційна система | Windows XP Professional SP3, 32bit |
| Firebird | 2.1.3 SuperServer (snapshot) |
| Завантажувач | Власний завантажувач із тесту на основі tpc |
План
У нас був дуже простий план для цього експерименту:
- Створити базу даних і завантажити її даними об’ємом 1 ТБ, без індексів
- Створити первинні ключі та відповідні індекси (тому фактичний розмір бази даних перевищує 1 ТБ)
- Зібрати статистику бази даних
- Виконати кілька SQL-запитів і оцінити продуктивність бази даних
Конфігурація бази даних і сервера Firebird
База даних має розмір сторінки 16384 байти, такий самий, як кластер жорсткого диска, щоб максимізувати продуктивність диска (читати/записувати 1 сторінку за один цикл введення-виведення).
У конфігурації Firebird ми налаштували додатковий каталог для тимчасового простору та вказали на диск об’ємом 640 ГБ (де було вільно ~300 ГБ).
Етап завантаження
Дані завантажувалися в цю базу даних кількома етапами. Комп’ютер використовувався під час операцій завантаження як звичайний настільний ПК (у нас були MS Office, Firefox, IBAnalyst тощо - одночасно працювало близько 8-12 програм). Якби ми виділили апаратне забезпечення лише для цього завдання, ймовірно, було б швидше, тому розглядайте ці значення лише як приклад нижньої межі; вони, безумовно, не є найкращими результатами.
Таблиця 3: Операції завантаження
| |
| Опис | Значення |
| Час завантаження | ~70 годин |
| Загальна кількість вставлених записів | 6,2 мільярда |
| Середня швидкість вставки | 24500 записів/секунду |
| Середній розмір запису | 146 байт (мін. 13 байт, макс. - 600 байт) |
| Транзакції | 646489 |
Ми витратили ~4 дні на завантаження, і після цього мали базу даних Firebird розміром рівно 1 ТБ (тобто 1 099 900 125 184 байти).
Нижче ви можете побачити зростання бази даних і динаміку транзакцій у переглядачі FBDataGuard:

Індекси
Ми створювали індекси один за одним і фіксували час їх створення та відповідний розмір тимчасового файлу, використаного для сортування.
Найбільший індекс було створено для таблиці ORDER_LINE. Його первинний ключ містить чотири поля (Smallint, Smallint, Integer і Smallint). Тимчасовий файл для цього індексу сортування становив 182 ГБ, а кінцевий розмір індексу в базі даних - 29,3 ГБ.
Цікаво бачити, що навіть індекс для таблиці з 3,8 мільярда записів має глибину = 3, оскільки розмір сторінки становив 16384 байти, тому немає жодних накладних витрат під час пошуку даних за первинним ключем для цієї таблиці.
Статистика
Після цього ми зібрали статистику бази даних. Це зайняло 7 годин 32 хвилини 45 секунд.
Ми зібрали ключову статистичну інформацію в одну таблицю та включили деякі запити та вимірювання часу:
Таблиця 4: Зведена статистика для бази даних 1 ТБ
| Назва таблиці | Кількість записів | Розмір, ГБ | Час виконання select count(*) | Час створення індексу | Розмір тимчасового файлу, ГБ | Розмір індексу, ГБ |
| WAREHOUSE | 1240 | 0.002 | 0s | 0 | 0 | 0.0 | | ITEM | 100000 | 0.012 | 0.7s | - | - | 0.0 | | DISTRICT | 124000 | 0.017 | 0.7s | 6 | - | 0.0 | | NEW_ORDER | 111600000 | 32 | 20m 00s | 23m 00s | 4.56 | 0.8 | | CUSTOMER | 372000000 | 224 | - | 41m 00s | - | 2.6 | | customer_last | | | | 1h 52m 32s | 12.4 | 2.3 | | fk_cust_ware | | | | 2h 10m 51s | - | 2.3 | | HISTORY | 372000000 | 32 | - | - | - | - | | ORDERS | 372000000 | 25 | 32m 00s | 45m 41s | 15.2 | 2.5 | | STOCK | 1240000000 | 404 | - | 3h 34m 44s | 41.5 | 9.2 | | ORDER_LINE | 3720051796 | 359 | - | 12h 6m 18s | 182.0 | 29.3 |
Статистику бази даних можна завантажити звідси.
Ви можете використовувати безкоштовний FBDataGuard Community Edition Viewer для інтерпретації текстових даних та перегляду не лише показників продуктивності бази даних, але й споживання CPU та пам’яті.
Запити
Перш за все, ми виконали select count(*) запити до кількох таблиць (див. 4-ту колонку в Таблиці 4 вище). Як відомо, через багатоверсійну природу Firebird, select count(*) для всієї таблиці є дорогою операцією для сервера, оскільки вимагає відвідування кожної сторінки, і досвідчені розробники Firebird не використовують select count(*), але ми використали його, щоб продемонструвати загальне співвідношення продуктивності бази даних та апаратного забезпечення.
Після запитів select count ми виконали запити з реального сценарію, і, чесно кажучи, ми були вражені такими хорошими результатами. Переконайтеся самі:
| Запит | Статистика | Опис |
| select w_id, w_name, c_id, c_last from WAREHOUSE, customer where c_w_id = w_id |
PLAN JOIN (WAREHOUSE NATURAL, CUSTOMER INDEX (FK_CUST_WARE)) ------ Інформація про продуктивність —– Час підготовки = 15ms Час виконання = 79ms Середній час вибірки = 6.08 ms Поточна пам’ять = 272 264 476 Максимальна пам’ять = 272 514 048 Буфери пам’яті = 16 384 Читання з диска в кеш = 82 Записи з кеша на диск = 0 Вибірки з кеша = 3 648 |
Просте з’єднання таблиць з 12400 та 372000000 записами, без умов WHERE. «Середній час вибірки = 6.08 ms» - це час отримання першого рядка. |
| select w_id, w_name, c_id, c_last from WAREHOUSE, customer where c_w_id = w_id and c_w_id = 10000 |
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE)) ------ Інформація про продуктивність —– Час підготовки = 16ms Час виконання = 78ms Середній час вибірки = 6.00 ms Поточна пам’ять = 272 266 148 Максимальна пам’ять = 272 514 048 Буфери пам’яті = 16 384 Читання з диска в кеш = 88 Записи з кеша на диск = 0 Вибірки з кеша = 3 656 |
З’єднання тих самих таблиць з умовою, яка змушує вибірку останніх записів. «Середній час вибірки = 6.00 ms» - це час отримання першого рядка. |
| select count(*) from WAREHOUSE, customer where c_w_id = w_id and c_w_id = 10000 Результат = 30000 |
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE)) ------ Інформація про продуктивність —– Час підготовки = 0ms Час виконання = 453ms Середній час вибірки = 453.00 ms Поточна пам’ять = 272 263 844 Максимальна пам’ять = 272 514 048 Буфери пам’яті = 16 384 Читання з диска в кеш = 1 048 Записи з кеша на диск = 0 Вибірки з кеша = 60 024 |
Підрахунок записів для попереднього запиту |
| SELECT * FROM ORDER_LINE WHERE OL_W_ID = 500 |
Plan PLAN (ORDER_LINE INDEX (ORDER_LINE_PK)) ------ Інформація про продуктивність —– Час підготовки = 0ms Час виконання = 94ms Середній час вибірки = 7.23 ms Поточна пам’ять = 136 445 536 Максимальна пам’ять = 136 592 176 Буфери пам’яті = 8 192 Читання з диска в кеш = 150 Записи з кеша на диск = 0 Вибірки з кеша = 2 402 |
Запит до найбільшої таблиці (3.8B записів). «Середній час вибірки = 7.23 ms» - це час отримання першого рядка. |
<br>Plan<br><br>PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))<br><br> <br><br>------ Інформація про продуктивність ------<br><br>Час підготовки = 0ms<br><br>Час виконання = 3s 438ms<br><br>Середній час вибірки = 0.01 ms<br><br>Поточна пам'ять = 136 445 496<br><br>Максимальна пам'ять = 136 592 176<br><br>Буфери пам'яті = 8 192<br><br>Читання з диска в кеш = 1 840<br><br>Записи з кеша на диск = 0<br><br>Вибірки з кеша = 598 636<br> |
||
| SELECT * FROM ORDER_LINE WHERE OL_W_ID = 500 |
Той самий запит до найбільшої таблиці (3.8B записів), але цього разу ми отримали всі записи (299245 записів отримано). | |
| select w_id, w_name, c_id, c_last from WAREHOUSE, customer where c_w_id = w_id and (c_w_id > 8000) and (c_w_id < 10000) |
Plan PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE)) ------ Інформація про продуктивність —– Час підготовки = 0ms Час виконання = 125ms Середній час вибірки = 9.62 ms Поточна пам’ять = 272 270 824 Максимальна пам’ять = 272 514 048 Буфери пам’яті = 16 384 Читання з диска в кеш = 91 Записи з кеша на диск = 0 Вибірки з кеша = 3 659 |
З’єднання таблиць з 1240 записами та 372M записів. |
| select count(*) from WAREHOUSE, customer where c_w_id = w_id and (c_w_id > 8000) and (c_w_id < 10000) Результат = 59 970 000 |
Plan PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE)) ------ Інформація про продуктивність —– Час підготовки = 0ms Час виконання = 13m 4s 718ms Середній час вибірки = 784 718.00 ms Поточна пам’ять = 272 268 532 Максимальна пам’ять = 272 514 048 Буфери пам’яті = 16 384 Читання з диска в кеш = 2 332 583 Записи з кеша на диск = 0 Вибірки з кеша = 119 977 902 |
Підрахунок записів для попереднього запиту |
Підсумок
У цьому експерименті Firebird показав наступні результати
-
Безсумнівна здатність працювати з великими базами даних. Ми впевнені, що можна створити та використовувати базу даних 32 Tb на відповідному апаратному забезпеченні, і Firebird покаже таку ж високу продуктивність, як і для менших баз даних (тобто 1Tb і нижче).
-
Хороша масштабованість та напрочуд малий слід. База даних 1Tb була створена на звичайному настільному комп’ютері, і, що більш важливо, її можна використовувати для виконання загальних запитів: якщо ви не отримуєте мільйони записів, швидкість запитів така ж, як і для баз даних середнього розміру (10-15Gb).
Це ще не кінець цього експерименту: ми плануємо виконати деякі запити, зібрати додаткову статистику та незабаром опублікувати більш детальний звіт. Будь ласка, слідкуйте за оновленнями.
Контакти
Надсилайте всі ваші запитання та звернення на [email protected]