2010-09-13 10 views

Odpowiedz

7

można policzyć całkowity rozmiar wszystkich pól BLOB w bazie danych z następującym stwierdzeniem:

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

zmodyfikowałem przykład kodu Andreja aby pokazać wielkość każdego pola blob, nie tylko suma wszystkich bąble .

Używane SET TERM, aby skopiować &, wkleić ten fragment bezpośrednio do narzędzi takich jak 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 ;# 

Ten przykład nie działa z ORDER BY, może bardziej eleganckie rozwiązanie bez EXECUTE BLOCK istnieje.