Bu sayfa makine çevirisidir. İngilizce orijinalini okuyun. English

IBSurgeon kütüphanesi

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

  1. Veritabanı oluşturun ve dizinler olmadan 1Tb veriyle yükleyin
  2. Birincil anahtarlar ve uygun dizinler oluşturun (böylece veritabanı boyutu aslında 1Tb’den fazladır)
  3. Veritabanı istatistiklerini toplayın
  4. 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

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

  2. İ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.