1 TB Firebird veritabanı: ön rapor
Dmitry Kuzmenko, son güncelleme 31-03-2014
Bu belgenin çevirileri: Portekizce Rusça Çince
Daha da büyük (1.7 Terabayt) veritabanı hakkındaki makalemizi okuyun: 1.7 Terabayt Firebird SQL Veritabanı Hakkında Daha Fazla Detay.
Neden terabaytlık Firebird veritabanı oluşturmalı?
Birçok şirket büyük Firebird veritabanlarıyla çalışır ve önemli iş operasyonlarını desteklemek için onlara güvenir. Bazı Firebird veritabanları zaten yüzlerce gigabayt boyutundadır ve büyümeye devam etmektedir (bkz. “Kim Büyük?” bölümü) ve bunların 2, 3 veya 5 kat daha büyük olacağı anı tahmin etmek kolaydır. Bu nedenle veritabanı yöneticileri ve satıcılar, büyük veritabanlarıyla Firebird davranışını araştırmak ve bunları nasıl yönetecekleri konusunda bazı öneriler almakla ilgilenmektedir.
Ayrıca 1Tb Firebird veritabanı oluştururken aklımızda olan önemli bir neden, Firebird’ün “küçük veritabanları için” veritabanı motoru olarak yaygın algısının nihai olarak ortadan kaldırılmasıydı. Bu efsane artık ölmüş gibi görünüyor, ancak bazı analistler ve gazeteciler onu düzenli olarak mezardan çıkarıyor ve umarız bu saçma algıyla sonunda bitiririz.
| ## Donanım |
Firebird, inanılmaz ölçeklenebilirliğiyle bilinir ve bu araştırma bunu bir kez daha doğruladı. Bu deneyin ilk amacı sadece 1Tb boyutunda bir Firebird veritabanı oluşturmaktı, bu yüzden normal bir masaüstü bilgisayar kullandık:
Tablo 1: Donanım
| Bileşen | Parametreler |
| CPU | AMDAthlon 64 x2 5200 |
| RAM | 4GB |
| Anakart | MSI K9N Platinum |
| HDD1 (işletim sistemi ve geçici) | ST3160815AS, 160GB, SATA II |
| HDD2 (yardımcı) | HDT721064SLA360, 640GB,SATAII |
| HDD2 (yardımcı) | HDS728080PLA380, 80GB, SATA I |
| HDD3 (veritabanı) | ST31500341AS, 1.5TB, SATA II (Ürün Yazılımı CC1H) |
Özünde, ofis masaüstü bilgisayarlarımızdan birine 1.5Tb HDD’yi başka bir değişiklik yapmadan koyduk. Bu HDD, 16Kb küme boyutuyla biçimlendirildi (aşağıda görebileceğiniz gibi veritabanının sayfa boyutuyla aynı).
Yazılım
Masaüstü bilgisayar olduğu için işletim sistemi Windows XP Professional SP3, 32bit’tir. Testi gerçekleştirmek için TPC tabanlı araç setinden yükleyiciyi kullandık (http://ibdeveloper.com/tests/tpc-c/ adresinden indirin, hem ikili dosyalar hem de kaynaklar mevcuttur).
Yükleyicinin verileri gerçek hayat senaryosunda olduğu gibi eklediğini vurgulamak isteriz: kayıtlar tablo tablo değil, birkaç ana-detay-alt detay tablosuna eklenir ve veritabanı içinde (ve fiziksel disk alanlarında) konumlandırılır.
Tablo 2: Yazılım
| Yazılım | Sürüm |
| İşletim sistemi | Windows XP Professional SP3, 32bit |
| Firebird | 2.1.3 SuperServer (anlık görüntü) |
| Yükleyici | tpc tabanlı testten özel yükleyici |
Plan
Bu deney için çok basit bir planımız vardı:
- Veritabanı oluşturun ve dizinler olmadan 1Tb veriyle yükleyin
- Birincil anahtarlar ve uygun dizinler oluşturun (böylece veritabanı boyutu aslında 1Tb’den fazladır)
- Veritabanı istatistiklerini toplayın
- Birkaç SQL sorgusu çalıştırın ve veritabanı performansını değerlendirin
Veritabanı ve Firebird sunucu yapılandırması
Veritabanı, disk performansını en üst düzeye çıkarmak için HDD kümesiyle aynı olan 16384 bayt sayfa boyutuna sahiptir (bir G/Ç döngüsünde 1 sayfa okumak/yazmak için).
Firebird yapılandırmasında geçici alan için ek bir dizin yapılandırdık ve onu 640Gb’lik diske yönlendirdik (yaklaşık 300Gb boştu).
Yükleme adımı
Veriler bu veritabanına birkaç adımda yüklendi. Yükleme işlemleri sırasında bilgisayar normal bir masaüstü olarak kullanıldı (MS Office, Firefox, IBAnalyst vb. vardı - aynı anda yaklaşık 8-12 program çalışıyordu). Donanımı yalnızca bu göreve ayırsaydık, muhtemelen daha hızlı olurdu, bu yüzden lütfen bu değerleri yalnızca düşük kaliteli bir örnek olarak değerlendirin; kesinlikle en iyi sonuçlar değiller.
Tablo 3: Yükleme işlemleri
| |
| Açıklama | Değer |
| Yükleme süresi | ~70 saat |
| Eklenen toplam kayıt | 6.2 milyar |
| Ortalama ekleme hızı | 24500 kayıt/saniye |
| Ortalama kayıt boyutu | 146 bayt (min 13 bayt, maks - 600 bayt) |
| İşlemler | 646489 |
Yükleme için ~4 gün harcadık ve sonrasında tam olarak 1Tb boyutunda (yani 1 099 900 125 184 bayt) bir Firebird veritabanımız oldu.
Aşağıda FBDataGuard Viewer’da veritabanı büyümesini ve işlem dinamiklerini görebilirsiniz:

Dizinler
Dizinleri tek tek oluşturduk ve oluşturma sürelerini ve sıralama için kullanılan geçici dosyanın uygun boyutunu saydık.
En büyük dizin ORDER_LINE tablosu için oluşturuldu. Birincil anahtarı dört alan içerir (Smallint, Smallint, Integer ve Smallint). Bu sıralama dizini için geçici dosya 182Gb idi ve veritabanındaki son dizin boyutu 29.3Gb’dir.
3.8 milyar kayıtlı tablo için bile dizinin derinliğinin 3 olması ilginçtir, çünkü sayfa boyutu 16384 bayttı, bu nedenle bu tablo için birincil anahtarı kullanarak veri ararken ek yük yoktur.
İstatistikler
Bundan sonra veritabanı istatistiklerini topladık. 7 saat 32 dakika 45 saniye sürdü.
Anahtar istatistik bilgilerini tek bir tabloya koyduk ve bazı sorguları ve zaman ölçümlerini ekledik:
Tablo 4: 1Tb veritabanı için konsolide istatistikler
| Tablo adı | Kayıt sayıları | Boyut, gb | select count(*) yürütme süresi | Dizin oluşturma süresi | Geçici dosya boyutu, Gb | Dizin boyutu, 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 | 20dk 00sn | 23dk 00sn | 4.56 | 0.8 |
| CUSTOMER | 372000000 | 224 | - | 41dk 00sn | - | 2.6 |
| customer_last | 1sa 52dk 32sn | 12.4 | 2.3 | |||
| fk_cust_ware | 2sa 10dk 51sn | - | 2.3 | |||
| HISTORY | 372000000 | 32 | - | - | - | - |
| ORDERS | 372000000 | 25 | 32dk 00sn | 45dk 41sn | 15.2 | 2.5 |
| STOCK | 1240000000 | 404 | - | 3sa 34dk 44sn | 41.5 | 9.2 |
| ORDER_LINE | 3720051796 | 359 | - | 12sa 6dk 18sn | 182.0 | 29.3 |
Veritabanı istatistikleri buradan indirilebilir.
Metin verilerini yorumlamak ve yalnızca veritabanı performans metriklerini değil, aynı zamanda CPU ve bellek tüketimini de görmek için ücretsiz FBDataGuard Community Edition Viewer’ı kullanabilirsiniz.
Sorgular
Her şeyden önce, birkaç tabloda select count(*) sorguları çalıştırdık (yukarıdaki Tablo 4’ün 4. sütununa bakın). Bildiğiniz gibi, Firebird’ün çok sürümlü doğası nedeniyle tüm tablo için select count(*) sunucu için pahalı bir işlemdir çünkü her sayfayı ziyaret etmeyi gerektirir ve deneyimli Firebird geliştiricileri select count(*) kullanmaz, ancak biz bunu veritabanı ve donanımın genel performans oranını göstermek için kullandık.
select count sorgularından sonra gerçek hayat senaryosundan sorgular çalıştırdık ve dürüst olmak gerekirse bu kadar iyi sonuçlara hayran kaldık. Kendiniz görün:
| Sorgu | İstatistikler | Açıklama |
| 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)) ------ Performans bilgisi ——_ Hazırlama süresi = 15ms Yürütme süresi = 79ms Ortalama getirme süresi = 6.08 ms Geçerli bellek = 272 264 476 Maks bellek = 272 514 048 Bellek arabellekleri = 16 384 Diskten önbelleğe okumalar = 82 Önbellekten diske yazmalar = 0 Önbellekten getirmeler = 3 648 |
12400 ve 372000000 kayıtlı tabloların basit birleşimi, WHERE koşulu yok. “Ortalama getirme süresi = 6.08 ms” ilk satırı getirme içindir. |
| 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)) ------ Performans bilgisi ——_ Hazırlama süresi = 16ms Yürütme süresi = 78ms Ortalama getirme süresi = 6.00 ms Geçerli bellek = 272 266 148 Maks bellek = 272 514 048 Bellek arabellekleri = 16 384 Diskten önbelleğe okumalar = 88 Önbellekten diske yazmalar = 0 Önbellekten getirmeler = 3 656 |
Aynı tabloların, son kayıtların seçimini zorlayan koşulla birleşimi. “Ortalama getirme süresi = 6.00 ms” ilk satırı getirme içindir. |
| select count(*) from WAREHOUSE, customer where c_w_id = w_id and c_w_id = 10000 Sonuç = 30000 |
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE)) ------ Performans bilgisi ——_ Hazırlama süresi = 0ms Yürütme süresi = 453ms Ortalama getirme süresi = 453.00 ms Geçerli bellek = 272 263 844 Maks bellek = 272 514 048 Bellek arabellekleri = 16 384 Diskten önbelleğe okumalar = 1 048 Önbellekten diske yazmalar = 0 Önbellekten getirmeler = 60 024 |
Önceki sorgu için kayıtları say |
| SELECT * FROM ORDER_LINE WHERE OL_W_ID = 500 |
Plan PLAN (ORDER_LINE INDEX (ORDER_LINE_PK)) ------ Performans bilgisi ——_ Hazırlama süresi = 0ms Yürütme süresi = 94ms Ortalama getirme süresi = 7.23 ms Geçerli bellek = 136 445 536 Maks bellek = 136 592 176 Bellek arabellekleri = 8 192 Diskten önbelleğe okumalar = 150 Önbellekten diske yazmalar = 0 Önbellekten getirmeler = 2 402 |
En büyük tabloya (3.8B kayıt) sorgu. “Ortalama getirme süresi = 7.23 ms” ilk satırı getirme içindir. |
<br>Plan<br><br>PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))<br><br> <br><br>------ Performans bilgisi ------\_<br><br>Hazırlama süresi = 0ms<br><br>Yürütme süresi = 3sn 438ms<br><br>Ortalama getirme süresi = 0.01 ms<br><br>Geçerli bellek = 136 445 496<br><br>Maks bellek = 136 592 176<br><br>Bellek arabellekleri = 8 192<br><br>Diskten önbelleğe okumalar = 1 840<br><br>Önbellekten diske yazmalar = 0<br><br>Önbellekten getirmeler = 598 636<br> |
| SELECT * FROM ORDER_LINE
WHERE OL_W_ID = 500 | En büyük tabloya (3.8 milyar kayıt) aynı sorgu, ancak bu sefer tüm kayıtları getirdik (299245 kayıt getirildi). |
| | |
| 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))
------ Performans bilgisi ——
Hazırlama süresi = 0ms
Yürütme süresi = 125ms
Ortalama getirme süresi = 9.62 ms
Geçerli bellek = 272 270 824
Maksimum bellek = 272 514 048
Bellek arabellekleri = 16 384
Diskten önbelleğe okumalar = 91
Önbellekten diske yazmalar = 0
Önbellekten getirmeler = 3 659 | 1240 kayıt ve 372M kayıt içeren tabloları birleştirin. |
| select count(*)
from WAREHOUSE, customer
where c_w_id = w_id and (c_w_id > 8000) and (c_w_id < 10000)
Sonuç = 59 970 000 | Plan
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE))
------ Performans bilgisi ——
Hazırlama süresi = 0ms
Yürütme süresi = 13m 4s 718ms
Ortalama getirme süresi = 784 718.00 ms
Geçerli bellek = 272 268 532
Maksimum bellek = 272 514 048
Bellek arabellekleri = 16 384
Diskten önbelleğe okumalar = 2 332 583
Önbellekten diske yazmalar = 0
Önbellekten getirmeler = 119 977 902 | Önceki sorgu için kayıtları sayın |
Özet
Bu deneyde Firebird aşağıdaki sonuçları göstermektedir
-
Büyük veritabanlarını işleme konusunda tartışmasız yetenek. Uygun donanım üzerinde 32 Tb’lik bir veritabanı oluşturmanın ve kullanmanın mümkün olduğundan oldukça eminiz ve Firebird, daha küçük veritabanları (yani 1Tb ve altı) için gösterdiği aynı yüksek performansı gösterecektir.
-
İyi ölçeklenebilirlik ve şaşırtıcı derecede küçük ayak izi. 1Tb veritabanı normal bir masaüstü bilgisayarda oluşturuldu ve daha da önemlisi, genel sorguları çalıştırmak için kullanılabilir: milyonlarca kayıt getirmezseniz, sorgu hızı orta boyutlu veritabanlarıyla (10-15Gb) aynıdır.
Bu deneyin sonu değil: bazı sorgular çalıştırmayı, ek istatistikler toplamayı ve yakında daha ayrıntılı bir rapor yayınlamayı planlıyoruz. Lütfen bizi izlemeye devam edin.
İletişim
Tüm sorularınızı ve taleplerinizi [email protected] adresine gönderin.