Comment puis-je mesurer la quantité d'espace pris par blobs sur une base de données Firebird 2.1?
-
02-10-2019 - |
Question
J'ai une base de données de production, en utilisant Firebird 2.1, où je dois savoir combien d'espace est utilisé par chaque table, y compris les blobs. Le blob-partie est délicate, car il ne couvre pas l'utilisation du rapport statistique standard.
Je n'ai pas un accès facile au bureau du serveur, donc l'installation, etc. UDFs est pas une bonne solution.
Comment puis-je faire facilement?
La solution
Vous pouvez compter la taille totale de tous les champs BLOB dans une base de données avec la déclaration suivante:
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
Autres conseils
Je modifié l'exemple de code de Andrej pour montrer la taille de chaque champ blob, non seulement la somme de tous les blobs.
SET TERM utilisé de sorte que vous pouvez copier et coller cet extrait directement à des outils tels que FlameRobin.
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 ;#
Cet exemple ne fonctionne pas avec ORDER BY, peut-être une solution plus élégante sans EXECUTE existe BLOC.