Comment puis-je mesurer la quantité d'espace pris par blobs sur une base de données Firebird 2.1?

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

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top