2010-09-13 9 views

Respuesta

7

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

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 
0

he modificado 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 se utiliza SET TERM para que pueda copiar & pegue este fragmento directamente en 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 exista una solución más elegante sin EXECUTE BLOCK.

Cuestiones relacionadas