Diese Seite wurde maschinell übersetzt. Lesen Sie das englische Original. English

IBSurgeon-Bibliothek

1-TB-Firebird-Datenbank: Vorläufiger Bericht

Dmitry Kuzmenko, letzte Aktualisierung 31-03-2014

Übersetzungen dieses Dokuments: Portugiesisch Russisch Chinesisch

Lesen Sie unseren Artikel über eine noch größere (1,7 Terabyte) Datenbank: Weitere Details zur 1,7 Terabyte Firebird SQL Datenbank.

Warum eine Terabyte-Firebird-Datenbank erstellen?

Viele Unternehmen arbeiten mit großen Firebird-Datenbanken und verlassen sich auf sie, um wichtige Geschäftsabläufe zu unterstützen. Einige Firebird-Datenbanken sind bereits hunderte Gigabyte groß und wachsen weiter (siehe Abschnitt „Wer ist groß?"), und es ist leicht vorherzusagen, wann sie 2, 3 oder 5 Mal größer werden. Daher sind Datenbankadministratoren und Anbieter daran interessiert, das Verhalten von Firebird mit großen Datenbanken zu untersuchen und Empfehlungen zur Verwaltung zu erhalten.

Ein weiterer wichtiger Grund, den wir bei der Erstellung der 1-TB-Firebird-Datenbank im Hinterkopf hatten, war die endgültige Beseitigung der weit verbreiteten Wahrnehmung von Firebird als Datenbank-Engine für „kleine Datenbanken". Dieser Mythos scheint jetzt tot zu sein, aber einige Analysten und Journalisten holen ihn regelmäßig aus dem Grab hervor, und wir hoffen, mit dieser lächerlichen Wahrnehmung endlich Schluss zu machen.

## Hardware

Firebird ist bekannt für seine unglaubliche Skalierbarkeit, und diese Untersuchung hat dies erneut bestätigt. Der ursprüngliche Zweck dieses Experiments war nur die Erstellung einer Firebird-Datenbank mit 1 TB Größe, daher verwendeten wir einen gewöhnlichen Desktop-Computer:

Tabelle 1: Hardware

Komponente Parameter
CPU AMDAthlon 64 x2 5200
RAM 4 GB
Motherboard MSI K9N Platinum
HDD1 (Betriebssystem und temporär) ST3160815AS, 160 GB, SATA II
HDD2 (Hilfslaufwerk) HDT721064SLA360, 640 GB, SATA II
HDD2 (Hilfslaufwerk) HDS728080PLA380, 80 GB, SATA I
HDD3 (Datenbank) ST31500341AS, 1,5 TB, SATA II (Firmware CC1H)

Im Wesentlichen haben wir die 1,5-TB-Festplatte in einen unserer Büro-Desktops eingebaut, ohne weitere Änderungen. Diese Festplatte wurde mit einer Clustergröße von 16 KB formatiert (derselben wie die Seitengröße der Datenbank, wie Sie unten sehen können).

Software

Da es sich um einen Desktop-Computer handelt, ist das Betriebssystem Windows XP Professional SP3, 32-Bit. Für den eigentlichen Test verwendeten wir den Loader aus dem TPC-basierten Toolkit (Download unter http://ibdeveloper.com/tests/tpc-c/, sowohl Binärdateien als auch Quellen sind verfügbar).

Wir möchten betonen, dass der Loader Daten so einfügt, wie sie in einem realen Szenario eingefügt würden: Datensätze werden eingefügt und in der Datenbank (und an physischen Speicherorten) in mehreren Master-Detail-Subdetail-Tabellen platziert, nicht Tabelle für Tabelle.

Tabelle 2: Software

Software Version
Betriebssystem Windows XP Professional SP3, 32-Bit
Firebird 2.1.3 SuperServer (Snapshot)
Loader Benutzerdefinierter Loader aus dem tpc-basierten Test

Plan

Wir hatten einen sehr einfachen Plan für dieses Experiment:

  1. Datenbank erstellen und mit 1 TB Daten laden, ohne Indizes
  2. Primärschlüssel und geeignete Indizes erstellen (die Datenbankgröße ist also tatsächlich größer als 1 TB)
  3. Datenbankstatistiken sammeln
  4. Mehrere SQL-Abfragen ausführen und die Datenbankleistung bewerten

Datenbank- und Firebird-Serverkonfiguration

Die Datenbank hat eine Seitengröße von 16384 Bytes, dieselbe wie der HDD-Cluster, um den Festplattendurchsatz zu maximieren (1 Seite pro E/A-Zyklus zu lesen/schreiben).

In der Firebird-Konfiguration haben wir ein zusätzliches Verzeichnis für den temporären Speicher konfiguriert und es auf die Festplatte mit 640 GB gelegt (wo ~300 GB frei waren).

Ladevorgang

Die Daten wurden in mehreren Schritten in diese Datenbank geladen. Der Computer wurde während der Ladevorgänge als normaler Desktop verwendet (wir hatten MS Office, Firefox, IBAnalyst usw. - etwa 8-12 Programme liefen gleichzeitig). Wenn wir die Hardware nur für diese Aufgabe gewidmet hätten, wäre es wahrscheinlich schneller gewesen, also betrachten Sie diese Werte bitte nur als ein Beispiel für die untere Grenze; sie sind definitiv nicht die Spitzenergebnisse.

Tabelle 3: Ladevorgänge

| |

Beschreibung Wert
Zeit zum Laden ~70 Stunden
Insgesamt eingefügte Datensätze 6,2 Milliarden
Durchschnittliche Einfügegeschwindigkeit 24500 Datensätze/Sekunde
Durchschnittliche Datensatzgröße 146 Bytes (min 13 Bytes, max - 600 Bytes)
Transaktionen 646489

Wir verbrachten ~4 Tage mit dem Laden, und danach hatten wir eine Firebird-Datenbank mit genau 1 TB Größe (d. h. 1 099 900 125 184 Bytes).

Unten sehen Sie das Datenbankwachstum und die Transaktionsdynamik im FBDataGuard Viewer:

Indizes

Wir haben die Indizes nacheinander erstellt und die Erstellungszeit sowie die Größe der für die Sortierung verwendeten temporären Datei gezählt.

Der größte Index wurde für die Tabelle ORDER_LINE erstellt. Ihr Primärschlüssel enthält vier Felder (Smallint, Smallint, Integer und Smallint). Die temporäre Datei für diesen Sortierindex war 182 GB groß, und die endgültige Indexgröße in der Datenbank beträgt 29,3 GB.

Es ist interessant zu sehen, dass selbst der Index für eine Tabelle mit 3,8 Milliarden Datensätzen eine Tiefe von 3 hat, da die Seitengröße 16384 Bytes betrug, sodass bei der Suche nach Daten über den Primärschlüssel für diese Tabelle kein Overhead entsteht.

Statistiken

Danach haben wir die Datenbankstatistiken gesammelt. Es dauerte 7 Stunden 32 Minuten 45 Sekunden.

Wir haben die wichtigsten Statistikinformationen in einer Tabelle zusammengefasst und einige Abfragen und Zeitmessungen eingefügt:

Tabelle 4: Konsolidierte Statistiken für die 1-TB-Datenbank

Tabellenname Datensatzanzahl Größe, GB Ausführungszeit von select count(*) Indexerstellungszeit Tmp-Dateigröße, GB Indexgröße, 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

Die Datenbankstatistiken können von hier heruntergeladen werden.

Sie können den kostenlosen FBDataGuard Community Edition Viewer verwenden, um Textdaten zu interpretieren und nicht nur Datenbankleistungsmetriken, sondern auch CPU- und Speicherverbrauch zu sehen.

Abfragen

Zunächst haben wir select count(*)-Abfragen auf mehreren Tabellen ausgeführt (siehe 4. Spalte in Tabelle 4 oben). Wie Sie wissen, ist select count(*) für die gesamte Tabelle aufgrund der Multi-Version-Natur von Firebird eine teure Operation für den Server, da sie den Besuch jeder Seite erfordert, und erfahrene Firebird-Entwickler verwenden kein select count(*), aber wir haben es verwendet, um das allgemeine Leistungsverhältnis von Datenbank und Hardware zu demonstrieren.

Nach den select count-Abfragen haben wir Abfragen aus einem realen Szenario ausgeführt, und um ehrlich zu sein, waren wir von so guten Ergebnissen erstaunt. Sehen Sie selbst:

Abfrage Statistiken Beschreibung
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))
------ Leistungsinfo ——
Vorbereitungszeit = 15ms
Ausführungszeit = 79ms
Durchschnittliche Abrufzeit = 6,08 ms
Aktueller Speicher = 272 264 476
Max. Speicher = 272 514 048
Speicherpuffer = 16 384
Lesevorgänge von Festplatte in Cache = 82
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus Cache = 3 648
Einfacher Join von Tabellen mit 12400 und 372000000 Datensätzen, keine WHERE-Bedingungen. „Durchschnittliche Abrufzeit = 6,08 ms" gilt für das Abrufen der ersten Zeile.
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))
------ Leistungsinfo ——
Vorbereitungszeit = 16ms
Ausführungszeit = 78ms
Durchschnittliche Abrufzeit = 6,00 ms
Aktueller Speicher = 272 266 148
Max. Speicher = 272 514 048
Speicherpuffer = 16 384
Lesevorgänge von Festplatte in Cache = 88
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus Cache = 3 656
Join derselben Tabellen mit einer Bedingung, die die Auswahl aktueller Datensätze erzwingt. „Durchschnittliche Abrufzeit = 6,00 ms" gilt für das Abrufen der ersten Zeile.
select count(*)
from WAREHOUSE, customer
where c_w_id = w_id and c_w_id = 10000
Ergebnis = 30000
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE))
------ Leistungsinfo ——
Vorbereitungszeit = 0ms
Ausführungszeit = 453ms
Durchschnittliche Abrufzeit = 453,00 ms
Aktueller Speicher = 272 263 844
Max. Speicher = 272 514 048
Speicherpuffer = 16 384
Lesevorgänge von Festplatte in Cache = 1 048
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus Cache = 60 024
Datensätze für die vorherige Abfrage zählen
SELECT * FROM ORDER_LINE
WHERE OL_W_ID = 500
Plan
PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))
------ Leistungsinfo ——
Vorbereitungszeit = 0ms
Ausführungszeit = 94ms
Durchschnittliche Abrufzeit = 7,23 ms
Aktueller Speicher = 136 445 536
Max. Speicher = 136 592 176
Speicherpuffer = 8 192
Lesevorgänge von Festplatte in Cache = 150
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus Cache = 2 402
Abfrage an die größte Tabelle (3,8 Mrd. Datensätze). „Durchschnittliche Abrufzeit = 7,23 ms" gilt für das Abrufen der ersten Zeile.
<br>Plan<br>
<br>PLAN (ORDER_LINE INDEX (ORDER_LINE_PK))<br>
<br> <br>
<br>------ Leistungsinfo ------<br>
<br>Vorbereitungszeit = 0ms<br>
<br>Ausführungszeit = 3s 438ms<br>
<br>Durchschnittliche Abrufzeit = 0,01 ms<br>
<br>Aktueller Speicher = 136 445 496<br>
<br>Max. Speicher = 136 592 176<br>
<br>Speicherpuffer = 8 192<br>
<br>Lesevorgänge von Festplatte in Cache = 1 840<br>
<br>Schreibvorgänge von Cache auf Festplatte = 0<br>
<br>Abrufe aus Cache = 598 636<br>

| SELECT * FROM ORDER_LINE
WHERE OL_W_ID = 500 | Dieselbe Abfrage auf die größte Tabelle (3,8 Mrd. Datensätze), aber diesmal haben wir alle Datensätze abgerufen (299.245 Datensätze abgerufen). | | | | | 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))
------ Leistungsinformationen ——
Vorbereitungszeit = 0ms
Ausführungszeit = 125ms
Durchschnittliche Abrufzeit = 9,62 ms
Aktueller Speicher = 272 270 824
Maximaler Speicher = 272 514 048
Speicherpuffer = 16 384
Lesevorgänge von Festplatte in Cache = 91
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus dem Cache = 3 659 | Tabellen mit 1.240 Datensätzen und 372 Mio. Datensätzen verknüpfen. | | select count(*)
from WAREHOUSE, customer
where c_w_id = w_id and (c_w_id > 8000) and (c_w_id < 10000)
Ergebnis = 59 970 000 | Plan
PLAN JOIN (WAREHOUSE INDEX (WAREHOUSE_PK), CUSTOMER INDEX (FK_CUST_WARE))
------ Leistungsinformationen ——
Vorbereitungszeit = 0ms
Ausführungszeit = 13m 4s 718ms
Durchschnittliche Abrufzeit = 784 718,00 ms
Aktueller Speicher = 272 268 532
Maximaler Speicher = 272 514 048
Speicherpuffer = 16 384
Lesevorgänge von Festplatte in Cache = 2 332 583
Schreibvorgänge von Cache auf Festplatte = 0
Abrufe aus dem Cache = 119 977 902 | Datensätze für die vorherige Abfrage zählen |

Zusammenfassung

In diesem Experiment zeigt Firebird die folgenden Ergebnisse

  1. Zweifellose Fähigkeit, große Datenbanken zu verwalten. Wir sind uns ziemlich sicher, dass es möglich ist, eine 32-TB-Datenbank auf geeigneter Hardware zu erstellen und zu verwenden, und Firebird wird dieselbe hohe Leistung zeigen wie bei kleineren Datenbanken (d. h. 1 TB und darunter).

  2. Gute Skalierbarkeit und erstaunlich kleiner Fußabdruck. Die 1-TB-Datenbank wurde auf einem normalen Desktop-Computer erstellt und, was noch wichtiger ist, sie kann für allgemeine Abfragen verwendet werden: Wenn Sie nicht Millionen von Datensätzen abrufen, ist die Abfragegeschwindigkeit dieselbe wie bei Datenbanken mittlerer Größe (10-15 GB).

Dies ist nicht das Ende dieses Experiments: Wir beabsichtigen, einige Abfragen auszuführen, zusätzliche Statistiken zu sammeln und in Kürze einen detaillierteren Bericht zu veröffentlichen. Bitte bleiben Sie dran.

Kontakte

Senden Sie alle Ihre Fragen und Anfragen an [email protected]