Firebird 2.1データベースでBlobsが取ったスペースの量を測定するにはどうすればよいですか?

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

  •  02-10-2019
  •  | 
  •  

質問

Firebird 2.1を使用して、生産データベースがあります。ここでは、ブロブを含む各テーブルで使用されているスペースの量を確認する必要があります。ブロブパートは、標準の統計レポートを使用してカバーされていないため、トリッキーなものです。

サーバーのデスクトップに簡単にアクセスできないため、UDFなどをインストールすることは良い解決策ではありません。

どうすればこれを簡単に行うことができますか?

役に立ちましたか?

解決

次のステートメントを使用して、データベース内のすべてのブロブフィールドの合計サイズをカウントできます。

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

他のヒント

Andrejのコード例を変更して、すべてのブロブの合計だけでなく、各ブロブフィールドのサイズを表示しました。

セット用語を使用して、このスニペットを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 ;#

この例は、注文で動作しません。おそらく、ブロックを実行することなく、よりエレガントなソリューションが存在する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top