【问题标题】:How can I measure the amount of space taken by blobs on a Firebird 2.1 database?如何测量 Firebird 2.1 数据库上 blob 占用的空间量?
【发布时间】:2011-04-11 15:00:05
【问题描述】:

我有一个使用 Firebird 2.1 的生产数据库,我需要在其中找出每个表(包括 blob)使用了多少空间。 blob 部分是棘手的部分,因为标准统计报告没有涵盖它。

我无法轻松访问服务器的桌面,因此安装 UDF 等不是一个好的解决方案。

我怎样才能轻松做到这一点?

【问题讨论】:

    标签: firebird firebird2.1


    【解决方案1】:

    您可以使用以下语句计算数据库中所有 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
    

    【讨论】:

      【解决方案2】:

      我修改了 Andrej 的代码示例以显示每个 blob 字段的大小,而不仅仅是所有 blob 的总和。

      并使用了 SET TERM,因此您可以将此 sn-p 直接复制并粘贴到 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 的更优雅的解决方案。

      【讨论】:

        猜你喜欢
        • 2018-07-16
        • 2010-10-05
        • 1970-01-01
        • 2011-11-17
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        相关资源
        最近更新 更多