如何测量 Firebird 2.1 数据库上 blob 占用的空间量?
Posted
技术标签:
【中文标题】如何测量 Firebird 2.1 数据库上 blob 占用的空间量?【英文标题】:How can I measure the amount of space taken by blobs on a Firebird 2.1 database? 【发布时间】:2011-04-11 15:00:05 【问题描述】:我有一个使用 Firebird 2.1 的生产数据库,我需要在其中找出每个表(包括 blob)使用了多少空间。 blob 部分是棘手的部分,因为标准统计报告没有涵盖它。
我无法轻松访问服务器的桌面,因此安装 UDF 等不是一个好的解决方案。
我怎样才能轻松做到这一点?
【问题讨论】:
【参考方案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 的更优雅的解决方案。
【讨论】:
以上是关于如何测量 Firebird 2.1 数据库上 blob 占用的空间量?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Firebird 2.1 中临时禁用表中的所有约束?
Firebird 2.1 在某些数据库表中存储大量行是不是有效?
Firebird 2.1 TIMESTAMP 算术和民用间隔