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

IBSurgeon библиотека

1 Tb Firebird baza podataka: preliminarni izveštaj

Dmitrij Kuzmenko, poslednje ažuriranje 31-03-2014

Prevodi ovog dokumenta: Portugalski Ruski Kineski

Pročitajte naš članak o još većoj bazi (1,7 terabajta): Više detalja o bazi od 1,7 terabajta.

Zašto kreirati terabajtnu Firebird bazu?

Mnoge kompanije rade sa velikim Firebird bazama i oslanjaju se na njih za podršku važnim poslovnim operacijama. Neke Firebird baze su već stotine gigabajta velike i nastavljaju da rastu (pogledajte odeljak „Ko je velik?“), i lako je predvideti trenutak kada postanu 2, 3 ili 5 puta veće. Zato su administratori baza i dobavljači zainteresovani da istraže ponašanje Firebird-a sa velikim bazama i dobiju neke preporuke kako da njima upravljaju.

Takođe, važan razlog koji smo imali na umu prilikom kreiranja 1Tb Firebird baze bio je konačno otklanjanje preovlađujuće percepcije o Firebird-u kao motoru baze podataka za „male baze“. Ovaj mit izgleda da je sada mrtav, ali neki analitičari i novinari ga redovno vraćaju iz groba, i nadamo se da ćemo konačno završiti sa ovom smešnom percepcijom.

## Hardver

Firebird je poznat po svojoj neverovatnoj skalabilnosti i ovo istraživanje je to još jednom potvrdilo. Prvobitna svrha ovog eksperimenta bila je samo kreiranje Firebird baze veličine 1Tb, pa smo koristili običan desktop računar:

Tabela 1: Hardver

Komponenta Parametri
CPU AMDAthlon 64 x2 5200
RAM 4GB
Matična ploča MSI K9N Platinum
HDD1 (operativni sistem i temp) ST3160815AS, 160GB, SATA II
HDD2 (pomoćni) HDT721064SLA360, 640GB,SATAII
HDD2 (pomoćni) HDS728080PLA380, 80GB, SATA I
HDD3 (baza) ST31500341AS, 1.5TB, SATA II (Firmware CC1H)

U suštini, stavili smo 1,5Tb HDD u jedan od naših kancelarijskih desktop računara, bez ikakvih drugih modifikacija. Ovaj HDD je formatiran sa veličinom klastera 16Kb (isto kao veličina stranice baze, kao što možete videti ispod).

Softver

Pošto je to desktop računar, operativni sistem je Windows XP Professional SP3, 32bit. Za samo izvršavanje testa koristili smo loader iz TPC-baziranog alata (preuzmite ga sa http://ibdeveloper.com/tests/tpc-c/, dostupni su i binarni fajlovi i izvorni kod).

Želeli bismo da naglasimo da loader ubacuje podatke kao što bi bili ubačeni u scenariju iz stvarnog života: zapisi se ubacuju i smeštaju unutar baze (i na fizičke oblasti diska) u nekoliko master-detail-subdetail tabela, a ne tabelu po tabelu.

Tabela 2: Softver

Softver Verzija
Operativni sistem Windows XP Professional SP3, 32bit
Firebird 2.1.3 SuperServer (snapshot)
Loader Prilagođeni loader iz tpc-baziranog testa

Plan

Imali smo vrlo jednostavan plan za ovaj eksperiment:

  1. Kreirati bazu i napuniti je sa 1Tb podataka, bez indeksa
  2. Kreirati primarne ključeve i odgovarajuće indekse (tako da je stvarna veličina baze veća od 1Tb)
  3. Prikupiti statistiku baze
  4. Pokrenuti nekoliko SQL upita i proceniti performanse baze

Konfiguracija baze i Firebird servera

Baza ima veličinu stranice 16384 bajta, isto kao klaster HDD-a, da bi se maksimizirale performanse diska (da se čita/piše 1 stranica u jednom I/O ciklusu).

U Firebird konfiguraciji smo konfigurisali dodatni direktorijum za temp prostor i usmerili ga na disk sa 640Gb (gde je ~300Gb bilo slobodno).

Korak učitavanja

Podaci su učitani u ovu bazu u nekoliko koraka. Računar je korišćen tokom operacija učitavanja kao običan desktop (imamo MS Office, Firefox, IBAnalyst, itd. - oko 8-12 programa je radilo istovremeno). Da smo posvetili hardver samo ovom zadatku, verovatno bi bio brži, pa molimo vas da ove vrednosti smatrate samo kao primer nižeg ranga; one definitivno nisu najbolji rezultati.

Tabela 3: Operacije učitavanja

| |

Opis Vrednost
Vreme učitavanja ~70 sati
Ukupno ubačenih zapisa 6,2 milijarde
Prosečna brzina ubacivanja 24500 zapisa/sekundi
Prosečna veličina zapisa 146 bajtova (min 13 bajtova, max - 600 bajtova)
Transakcije 646489

Proveli smo ~4 dana na učitavanju, a nakon toga smo imali Firebird bazu sa tačno 1Tb veličine (tj. 1 099 900 125 184 bajtova).

Ispod možete videti rast baze i dinamiku transakcija u FBDataGuard Viewer-u:

Indeksi

Kreirali smo indekse jedan po jedan i merili vreme njihovog kreiranja i odgovarajuću veličinu temp fajla korišćenog za sortiranje.

Najveći indeks je kreiran za tabelu ORDER_LINE. Njegov primarni ključ sadrži četiri polja (Smallint, Smallint, Integer i Smallint). Temp fajl za ovaj indeks sortiranja bio je 182Gb, a konačna veličina indeksa u bazi je 29,3Gb.

Zanimljivo je videti da čak i indeks za tabelu sa 3,8 milijardi zapisa ima dubinu = 3, jer je veličina stranice bila 16384 bajta, tako da nema dodatnog opterećenja pri pretraživanju podataka pomoću primarnog ključa za ovu tabelu.

Statistika

Nakon toga smo prikupili statistiku baze. To je trajalo 7 sati 32 minuta 45 sekundi.

Stavili smo ključne informacije statistike u jednu tabelu i uključili neke upite i merenja vremena:

Tabela 4: Konsolidovana statistika za 1Tb bazu

Naziv tabele Broj zapisa Veličina, gb Vreme izvršavanja select count(*) Vreme kreiranja indeksa Veličina tmp fajla, Gb Veličina indeksa, 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 |

Statistika baze podataka može se preuzeti ovde.

Možete koristiti besplatni FBDataGuard Community Edition Viewer za tumačenje tekstualnih podataka i pregled ne samo metrika performansi baze podataka, već i potrošnje 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-version prirode Firebird-a select count(*) za celu tabelu je skupa operacija za server jer zahteva obilazak svake stranice, i iskusni Firebird programeri ne koriste select count(*), ali smo ga koristili da demonstriramo ukupni odnos performansi baze podataka i hardvera.

Nakon select count upita pokrenuli smo upite iz realnog scenarija i, iskreno, bili smo zadivljeni tako dobrim rezultatima. Uverite se sami:

Upit Statistika 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
Jednostavan join tabela sa 12400 i 372000000 zapisa, bez WHERE uslova. „Avg fetch time = 6.08 ms“ odnosi se na preuzimanje 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
Join istih tabela sa uslovom koji forsira selekciju skorašnjih zapisa. „Avg fetch time = 6.00 ms“ odnosi se na preuzimanje 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.8B zapisa). „Avg fetch time = 7.23 ms“ odnosi se na preuzimanje 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.8B zapisa), ali ovog puta smo preuzeli sve zapise (preuzeto 299245 zapisa).
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
Join tabela sa 1240 zapisa i 372M 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

Rezime

U ovom eksperimentu Firebird pokazuje sledeće rezultate

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

  2. Dobra skalabilnost i neverovatno mali otisak. Baza podataka 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 preuzimate milione zapisa, brzina upita je ista kao za baze podataka umerene veličine (10-15Gb).

Ovo nije kraj ovog eksperimenta: nameravamo da pokrenemo još neke upite, prikupimo dodatnu statistiku i uskoro objavimo detaljniji izveštaj. Ostanite sa nama.

Kontakti

Sva vaša pitanja i upite šaljite na [email protected]