Wie kann ich die Menge an Speicherplatz durch Kleckse auf einer Firebird 2.1 Datenbank entnommen messen?
-
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?
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.