Как я могу измерить количество пространства, взятых на BLOBS на базе данных Firebird 2.1?
-
02-10-2019 - |
Вопрос
У меня есть производственная база данных, используя Firebird 2.1, где мне нужно выяснить, сколько места используется каждой таблицей, включая капли. Блоб-часть - это сложный, потому что оно не покрывается стандартным статистическим отчетом.
У меня нет легкого доступа к рабочему столу сервера, поэтому устанавливая UDFS и т. Д. Это не хорошее решение.
Как я могу сделать это легко?
Решение
Вы можете рассчитывать общий размер всех налей 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
Другие советы
Я изменил пример кода Andrej, чтобы показать размер каждого поля BLOB, не только сумма всех капель.
И использованный набор срок, чтобы вы могли скопировать и вставить этот фрагмент непосредственно на инструменты, такие как фламеробин.
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 ;#
Этот пример не работает с порядком, возможно, более элегантное решение без выполнения блока существует.