2010-09-13 12 views
6

Tôi có một cơ sở dữ liệu sản xuất, sử dụng Firebird 2.1, nơi tôi cần phải tìm hiểu bao nhiêu không gian được sử dụng bởi mỗi bảng, bao gồm cả các đốm màu. Các blob-part là một trong những khó khăn, bởi vì nó không được bảo hiểm bằng cách sử dụng báo cáo thống kê tiêu chuẩn.Làm thế nào tôi có thể đo lượng không gian được chụp bởi các đốm màu trên cơ sở dữ liệu Firebird 2.1?

Tôi không có quyền truy cập dễ dàng vào máy tính để bàn của máy chủ, do đó, việc cài đặt UDFs vv không phải là giải pháp tốt.

Tôi có thể làm điều này dễ dàng như thế nào?

Trả lời

7

Bạn có thể đếm tổng kích thước của tất cả các lĩnh vực BLOB trong một cơ sở dữ liệu với tuyên bố sau:

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

tôi sửa đổi đoạn mã nguồn của Andrej để hiển thị kích thước của từng lĩnh vực blob, không chỉ là tổng của tất cả các đốm màu .

Và sử dụng SET TERM để bạn có thể sao chép & dán đoạn mã này trực tiếp vào các công cụ như 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 ;# 

Ví dụ này không hoạt động với ORDER BY, có thể là giải pháp thanh lịch hơn không có EXECUTE BLOCK.

Các vấn đề liên quan