2016-06-09 10 views
2

ich eine kleine Firebird 2.5 Datenbank mit einem BLOB-Feld, da dies als „Hinweis“ erklärt habe:Beste Firebird blob Größe Seitengröße Beziehung

BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET UTF8 

Die Datenbank Seitengröße:

16.384 (That I'm suspecting is too high) 

Ich habe diese Auswahl ausgeführt, um die durchschnittliche Größe der verfügbaren Blobfelder zu ermitteln:

select avg(octet_length(items.note)) from items 

und bekam diese Information:

2.671 

Als Anfänger würde Ich mag die bessere Segmentgröße für dieses BLOB-Feld und die beste Datenbank-Seitengröße Ihrer Meinung nach wissen (ich weiß, dass dies von anderen Informationen abhängig ist, aber ich weiß noch nicht wie man es herausfinden kann).

+0

Lassen Sie die 'SEGMENT SIZE 80' weg, es ist nicht notwendig (und in den meisten Fällen ignoriert, wenn ich mich nicht irre). –

+0

Wie wäre es mit Seitengröße @Mark Rotteveel? – Britto

+1

Ich habe einen Kommentar hinterlassen, weil es keine Antwort auf Ihre Frage war. –

Antwort

1

Blobs in Firebird sind in separaten Seiten Ihrer Datenbank gespeichert. Das genaue Speicherformat hängt von der Größe Ihres Blobs ab. Wie in Blob Internal Storage beschrieben:

Blobs werden als Teil einer Datenreihe erstellt, sondern weil ein Blob von unbegrenzter Länge sein könnte, was tatsächlich mit der Datenzeile gespeichert wird, sind ein blobid, die Daten für den Blob wird separat auf speziellen Blob Seiten an anderer Stelle in der Datenbank gespeichert.

[..]

A Blob Seite speichert Daten für einen Blob. Für große Blobs könnte die Blob-Seite tatsächlich eine Blob-Zeiger-Seite sein, d.h. zum Speichern von Zeigern zu anderen Blob-Seiten verwendet werden. Für jeden Blob, der erstellt wird, ist ein Blob-Datensatz definiert, der Blob-Datensatz enthält den Speicherort der Blob-Daten und einige Informationen über den Blobs-Inhalt, der für die -Engine nützlich sein wird, wenn er versucht, den Blob abzurufen. Die Blobdaten könnten in drei leicht unterschiedlichen Arten gespeichert werden. Der Speichermechanismus ist bestimmt durch die Größe des Blobs und wird durch seine Ebene Nummer (0, 1 oder 2) identifiziert. Alle Blobs werden anfänglich als Level 0 erstellt, aber werden mit zunehmender Größe in Level 1 oder 2 umgewandelt.

Eine Ebene 0 Blob ist ein Blob, der auf der gleichen Seite wie der Blob Kopfsatz, für eine Datenseite von 4096 Bytes passen, wäre dies ein Klecks etwa 4052 Bytes sein (Seite Overhead - Schlitz - blob Kopfzeile aufnehmen).

Mit anderen Worten, wenn Ihre durchschnittliche Größe von Blobs ist 2671 Bytes (und die meisten größeren sind noch kleiner als +/- 4000 Byte), dann wahrscheinlich eine Seitengröße von 4096 ist optimal, da es Platz verschwendet wird reduce von durchschnittlich 16340 - 2671 = 13669 Bytes bis 4052 - 2671 = 1381 Bytes.

Aber für die Leistung selbst wird dies wahrscheinlich kaum eine Rolle spielen, und kleinere Seitengrößen haben andere Effekte, die Sie berücksichtigen müssen. Zum Beispiel verkleinert eine kleinere Seitengröße auch die maximale Größe eines Indexschlüssels, Indizes können tiefer werden (mehr Ebenen) und weniger Datensätze passen auf eine einzelne Seite (oder breitere Datensätze werden auf mehrere Seiten verteilt).

Ohne Messen und Testen ist es schwer zu sagen, ob 4096 für die Seitengröße die richtige Größe für Ihre Datenbank verwendet.

In Bezug auf Segmentgrößen: Es ist ein historisches Artefakt, das am besten ignoriert (und weggelassen) wird. Manchmal gehen Anwendungen oder Treiber fälschlicherweise davon aus, dass Blobs in der angegebenen Segmentgröße geschrieben oder gelesen werden müssen. In diesen seltenen Fällen kann die Angabe einer größeren Segmentgröße die Leistung verbessern. Wenn Sie es weglassen, wird Firebird auf einen Wert von 80 Standard

Von Binary Data Types:

Segment Size: die BLOB-Segment ist die Angabe Vergangenheit zu Zeiten rückschritt, wenn Anwendungen für mit BLOB Arbeits Daten wurden in C (Embedded SQL) mit Hilfe der gpre Pre-Compiler geschrieben. Heutzutage ist es effektiv irrelevant. Die Segmentgröße für BLOB-Daten wird von der Clientseite bestimmt und ist in der Regel größer als die Datenseitengröße, in jedem Fall .

+1

Afair, Blobs können auch auf derselben Datenseite mit anderen Feldern/Datensätzen gespeichert werden, wenn auf der Datenseite genügend freier Speicherplatz verfügbar ist. In diesem Fall können Datensätze fragmentiert werden (da der Blob wahrscheinlich den größten Teil des Datenseitenbereichs belegt), wodurch Abfragen verlangsamt werden, die den Blob nicht abrufen. – WarmBooter

+0

@WarmBooter Ich dachte das auch, aber ich konnte keinen Hinweis finden, wie es funktioniert, also nahm ich an, ich hätte es mit dem Verhalten eines anderen DBMS verwechselt. –