Wie kann ich die Menge an Speicherplatz durch Kleckse auf einer Firebird 2.1 Datenbank entnommen messen?

StackOverflow https://stackoverflow.com/questions/3699921

  •  02-10-2019
  •  | 
  •  

Frage

ich eine Produktionsdatenbank haben, unter Verwendung von Firebird 2.1, wo ich brauche, um herauszufinden, wie viel Speicherplatz durch jede Tabelle verwendet wird, einschließlich der Blobs. Der Blob-Teil ist das heikel, weil es nicht abgedeckt wird, um den Standard-statistischen Bericht mit.

Ich habe keinen einfachen Zugriff auf den Desktop des Servers, so die Installation von UDF usw. ist keine gute Lösung.

Wie kann ich dies leicht tun?

War es hilfreich?

Lösung

Sie können mit folgenden Anweisung in einer Datenbank Gesamtgröße aller BLOB-Felder zählen:

EXECUTE BLOCK RETURNS (BLOB_SIZE BIGINT)
AS
  DECLARE VARIABLE RN CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE FN CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE S BIGINT;
BEGIN
  BLOB_SIZE = 0;
  FOR
    SELECT r.rdb$relation_name, r.rdb$field_name 
      FROM rdb$relation_fields r JOIN rdb$fields f 
        ON r.rdb$field_source = f.rdb$field_name
    WHERE f.rdb$field_type = 261
    INTO :RN, :FN
  DO BEGIN
    EXECUTE STATEMENT
      'SELECT SUM(OCTET_LENGTH(' || :FN || ')) FROM ' || :RN ||
      ' WHERE NOT ' || :FN || ' IS NULL'
    INTO :S;
    BLOB_SIZE = :BLOB_SIZE + COALESCE(:S, 0);
  END
  SUSPEND;
END

Andere Tipps

I modifiziert, um das Codebeispiel von Andrej die Größe jedes BLOB-Feld zu zeigen, nicht nur die Summe aller Blobs.

Und gebrauchtes SET TERM so können Sie kopieren und fügen Sie diese direkt an Tool wie Flamerobin-Snippet.

SET TERM #;
EXECUTE BLOCK
RETURNS (BLOB_SIZE BIGINT, TABLENAME CHAR(31), FIELDNAME CHAR(31) )
AS
  DECLARE VARIABLE RN CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE FN CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE S BIGINT;
BEGIN
  BLOB_SIZE = 0;
  FOR
    SELECT r.rdb$relation_name, r.rdb$field_name 
      FROM rdb$relation_fields r JOIN rdb$fields f 
        ON r.rdb$field_source = f.rdb$field_name
    WHERE f.rdb$field_type = 261
    INTO :RN, :FN
  DO BEGIN
    EXECUTE STATEMENT
      'SELECT SUM(OCTET_LENGTH(' || :FN || ')) AS BLOB_SIZE, ''' || :RN || ''', ''' || :FN || '''
      FROM ' || :RN ||
      ' WHERE NOT ' || :FN || ' IS NULL'
    INTO :BLOB_SIZE, :TABLENAME, :FIELDNAME;
    SUSPEND;
  END
END
#
SET TERM ;#

Dieses Beispiel funktioniert nicht mit ORDER BY, vielleicht eine elegantere Lösung ohne EXECUTE BLOCK existiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top