¿Cómo puedo medir la cantidad de espacio que ocupan las gotas en una base de datos Firebird 2.1?

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

  •  02-10-2019
  •  | 
  •  

Pregunta

Tengo una base de datos de producción, usando Firebird 2.1, donde tengo que averiguar la cantidad de espacio utilizado por cada mesa, incluyendo las manchas. La burbuja-parte es la difícil, ya que no está cubierta con el informe estadístico estándar.

No tengo fácil acceso al escritorio del servidor, por lo que la instalación de las UDF, etc., no es una buena solución.

¿Cómo puedo hacer esto fácilmente I?

¿Fue útil?

Solución

Se puede contar con el tamaño total de todos los campos BLOB en una base de datos con la declaración siguiente:

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

Otros consejos

modificó el ejemplo de código de Andrej para mostrar el tamaño de cada campo blob, no sólo la suma de todas las manchas.

Y PLAZO sistema usado para que pueda copiar y pegar este fragmento directamente a herramientas como 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 ;#

Este ejemplo no funciona con ORDER BY, tal vez una solución más elegante sin ejecute el bloque existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top