2010-09-13 1 views
6

У меня есть производственная база данных с использованием Firebird 2.1, где мне нужно выяснить, сколько места используется для каждой таблицы, включая капли. Часть blob является сложной, поскольку она не покрывается стандартным статистическим отчетом.Как я могу измерить объем пространства, сделанного блобами в базе данных Firebird 2.1?

У меня нет простого доступа к рабочему столу сервера, поэтому установка UDF и т. Д. Не является хорошим решением.

Как я могу сделать это легко?

ответ

7

Вы можете рассчитывать общий размер всех полей BLOB в базе данных с следующим утверждением:

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

Я изменил пример кода Andrej, чтобы показать размер каждого поля BLOB, не только сумма всех сгустков ,

И использовал SET TERM, чтобы скопировать & вставьте этот фрагмент непосредственно в инструменты, такие как 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 ;# 

Этот пример не работает с ORDER BY, возможно, более элегантное решение без EXECUTE BLOCK существует.

 Смежные вопросы

  • Нет связанных вопросов^_^