Ова страница је машински преведена. Прочитајте енглески оригинал. English

IBSurgeon библиотека

Извештај о бази података Firebird од 1 TB: прелиминарни извештај

Дмитриј Кузменко, последње ажурирање 31-03-2014

Преводи овог документа: Португалски Руски Кинески

Прочитајте наш чланак о још већој (1.7 терабајтној) бази података: Више детаља о бази података од 1.7 терабајта.

Зашто креирати терабајтну Firebird базу података?

Многе компаније раде са великим Firebird базама података и ослањају се на њих за подршку важним пословним операцијама. Неке од Firebird база података већ су величине стотина гигабајта и настављају да расту (погледајте одељак „Ко је велики?“), и лако је предвидети тренутак када ће постати 2, 3 или 5 пута веће. Стога су администратори база података и произвођачи заинтересовани да истраже понашање Firebird-а са великим базама података и добију препоруке како да њима управљају.

Такође, важан разлог који смо имали на уму приликом креирања 1Tb Firebird базе података било је коначно елиминисање распрострањене перцепције Firebird-а као мотора базе података за „мале базе података“. Овај мит изгледа да је сада мртав, али га неки аналитичари и новинари редовно васкрсавају, и надамо се да ћемо коначно окончати ову смешну перцепцију.

## Хардвер

Firebird је познат по својој невероватној скалабилности и ово истраживање је то још једном потврдило. Почетна сврха овог експеримента била је само креирање Firebird базе података величине 1Tb, па смо користили обичан десктоп рачунар:

Табела 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.5Tb HDD у један од наших канцеларијских десктоп рачунара, без икаквих других модификација. Овај HDD је форматиран са величином кластера 16Kb (истом као величина странице базе података, као што ћете видети испод).

Софтвер

Пошто је то десктоп рачунар, оперативни систем је Windows XP Professional SP3, 32bit. За стварно извођење теста користили смо учитавач из TPC-базираног комплета алата (преузмите га са http://ibdeveloper.com/tests/tpc-c/, доступни су и бинарни фајлови и изворни код).

Желимо да нагласимо да учитавач уноси податке онако како би били унети у реалном сценарију: записи се уносе и смештају унутар базе података (и на физичке области диска) у неколико master-detail-subdetail табела, не табелу по табелу.

Табела 2: Софтвер

Софтвер Верзија
Оперативни систем Windows XP Professional SP3, 32bit
Firebird 2.1.3 SuperServer (snapshot)
Учитавач Прилагођени учитавач из tpc-базираног теста

План

Имали смо веома једноставан план за овај експеримент:

  1. Креирати базу података и напунити је са 1Tb података, без индекса
  2. Креирати примарне кључеве и одговарајуће индексе (тако да је стварна величина базе већа од 1Tb)
  3. Прикупити статистику базе података
  4. Покренути неколико SQL упита и проценити перформансе базе података

Конфигурација базе података и Firebird сервера

База података има величину странице 16384 бајта, исту као HDD кластер, да би се максимизовала пропусност диска (читање/писање 1 странице у једном I/O циклусу).

У Firebird конфигурацији конфигурисали смо додатни директоријум за привремени простор и усмерили га на диск од 640Gb (где је било ~300Gb слободно).

Корак учитавања

Подаци су учитани у ову базу у неколико корака. Рачунар је коришћен током операција учитавања као обичан десктоп (имали смо MS Office, Firefox, IBAnalyst, итд. - око 8-12 програма је радило истовремено). Да смо посветили хардвер само овом задатку, вероватно би било брже, па вас молимо да ове вредности сматрате само примером нижег ранга; дефинитивно нису најбољи резултати.

Табела 3: Операције учитавања

| |

Опис Вредност
Време учитавања ~70 сати
Укупно уметнутих записа 6.2 милијарде
Просечна брзина уметања 24500 записа/секунди
Просечна величина записа 146 бајтова (мин 13 бајтова, макс - 600 бајтова)
Трансакције 646489

Потрошили смо ~4 дана на учитавање, и након тога смо имали Firebird базу података тачно величине 1Tb (тј. 1 099 900 125 184 бајта).

Испод можете видети раст базе података и динамику трансакција у FBDataGuard прегледачу:

Индекси

Креирали смо индексе један по један и измерили време њиховог креирања и одговарајућу величину привременог фајла коришћеног за сортирање.

Највећи индекс је креиран за табелу ORDER_LINE. Њен примарни кључ садржи четири поља (Smallint, Smallint, Integer и Smallint). Привремени фајл за овај индекс сортирања био је 182Gb, а коначна величина индекса у бази података је 29.3Gb.

Занимљиво је видети да чак и индекс за табелу са 3.8 милијарди записа има дубину = 3, јер је величина странице била 16384 бајта, тако да нема додатних трошкова приликом претраживања података коришћењем примарног кључа за ову табелу.

Статистика

Након тога смо прикупили статистику базе података. Трајало је 7 сати 32 минута 45 секунди.

Ставили смо кључне статистичке информације у једну табелу и укључили неке упите и мерења времена:

Табела 4: Консолидована статистика за 1Tb базу података

Назив табеле Број записа Величина, gb Време извршења select count(*) Време креирања индекса Величина привременог фајла, Gb Величина индекса, Gb

| 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 |

Statistike baze podataka možete preuzeti ovde.

Možete koristiti besplatni FBDataGuard Community Edition Viewer za tumačenje tekstualnih podataka i videti ne samo metrike performansi baze podataka, već i potrošnju CPU-a i memorije.

Upiti

Pre svega, pokrenuli smo select count(*) upite na nekoliko tabela (pogledajte 4. kolonu u Tabeli 4 iznad). Kao što znate, zbog multi-verzione prirode Firebird-a, select count(*) za celu tabelu je skupa operacija za server jer zahteva posetu svake stranice, a iskusni Firebird programeri ne koriste select count(*), ali smo ga mi koristili da bismo demonstrirali ukupan odnos performansi baze podataka i hardvera.

Nakon select count upita, pokrenuli smo upite iz scenarija iz stvarnog života i, da budemo iskreni, bili smo zadivljeni tako dobrim rezultatima. Uverite se sami:

Upit Statistike Opis
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))
------ Performance info ——
Prepare time = 15ms
Execute time = 79ms
Avg fetch time = 6.08 ms
Current memory = 272 264 476
Max memory = 272 514 048
Memory buffers = 16 384
Reads from disk to cache = 82
Writes from cache to disk = 0
Fetches from cache = 3 648
Jednostavno spajanje tabela sa 12400 i 372000000 zapisa, bez WHERE uslova. „Avg fetch time = 6.08 ms“ je za dohvatanje prvog reda.
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))
------ Performance info ——
Prepare time = 16ms
Execute time = 78ms
Avg fetch time = 6.00 ms
Current memory = 272 266 148
Max memory = 272 514 048
Memory buffers = 16 384
Reads from disk to cache = 88
Writes from cache to disk = 0
Fetches from cache = 3 656
Spajanje istih tabela sa uslovom koji forsira selekciju skorašnjih zapisa. „Avg fetch time = 6.00 ms“ je za dohvatanje prvog reda.
select count(*)
from WAREHOUSE, customer
where c_w_id = w_id and c_w_id = 10000
Result = 30000
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE))
------ Performance info ——
Prepare time = 0ms
Execute time = 453ms
Avg fetch time = 453.00 ms
Current memory = 272 263 844
Max memory = 272 514 048
Memory buffers = 16 384
Reads from disk to cache = 1 048
Writes from cache to disk = 0
Fetches from cache = 60 024
Brojanje zapisa za prethodni upit
SELECT * FROM ORDER_LINE
WHERE OL_W_ID = 500
Plan
PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))
------ Performance info ——
Prepare time = 0ms
Execute time = 94ms
Avg fetch time = 7.23 ms
Current memory = 136 445 536
Max memory = 136 592 176
Memory buffers = 8 192
Reads from disk to cache = 150
Writes from cache to disk = 0
Fetches from cache = 2 402
Upit na najveću tabelu (3.8 milijardi zapisa). „Avg fetch time = 7.23 ms“ je za dohvatanje prvog reda.
<br>Plan<br>
<br>PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))<br>
<br> <br>
<br>------ Performance info ------<br>
<br>Prepare time = 0ms<br>
<br>Execute time = 3s 438ms<br>
<br>Avg fetch time = 0.01 ms<br>
<br>Current memory = 136 445 496<br>
<br>Max memory = 136 592 176<br>
<br>Memory buffers = 8 192<br>
<br>Reads from disk to cache = 1 840<br>
<br>Writes from cache to disk = 0<br>
<br>Fetches from cache = 598 636<br>
SELECT * FROM ORDER_LINE
WHERE OL_W_ID = 500
Isti upit na najveću tabelu (3.8 milijardi zapisa), ali ovog puta smo dohvatili sve zapise (299245 zapisa dohvaćeno).
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))
------ Performance info ——
Prepare time = 0ms
Execute time = 125ms
Avg fetch time = 9.62 ms
Current memory = 272 270 824
Max memory = 272 514 048
Memory buffers = 16 384
Reads from disk to cache = 91
Writes from cache to disk = 0
Fetches from cache = 3 659
Spajanje tabela sa 1240 zapisa i 372 miliona zapisa.
select count(*)
from WAREHOUSE, customer
where c_w_id = w_id and (c_w_id > 8000) and (c_w_id < 10000)
Result = 59 970 000
Plan
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE))
------ Performance info ——
Prepare time = 0ms
Execute time = 13m 4s 718ms
Avg fetch time = 784 718.00 ms
Current memory = 272 268 532
Max memory = 272 514 048
Memory buffers = 16 384
Reads from disk to cache = 2 332 583
Writes from cache to disk = 0
Fetches from cache = 119 977 902
Brojanje zapisa za prethodni upit

Sažetak

U ovom eksperimentu Firebird pokazuje sledeće rezultate

  1. Nesumnjivu sposobnost rukovanja velikim bazama podataka. Prilično smo sigurni da je moguće kreirati i koristiti bazu od 32 Tb na odgovarajućem hardveru, i Firebird će pokazati iste visoke performanse kao što pokazuje za manje baze (tj. 1Tb i manje).

  2. Dobru skalabilnost i neverovatno mali otisak. Baza od 1Tb kreirana je na običnom desktop računaru i, što je još važnije, može se koristiti za izvršavanje opštih upita: ako ne dohvatate milione zapisa, brzina upita je ista kao kod baza srednje veličine (10-15Gb).

Ovo nije kraj ovog eksperimenta: nameravamo da pokrenemo još upita, prikupimo dodatne statistike i uskoro objavimo detaljniji izveštaj. Molimo vas da ostanete u toku.

Kontakti

Pošaljite sva svoja pitanja i upite na [email protected]