2010-09-13 14 views
6

मेरे पास फ़ायरबर्ड 2.1 का उपयोग करके एक उत्पादन डेटाबेस है, जहां मुझे यह पता लगाने की आवश्यकता है कि ब्लॉब्स समेत प्रत्येक तालिका द्वारा कितनी जगह का उपयोग किया जाता है। ब्लॉब-पार्ट मुश्किल है, क्योंकि यह मानक सांख्यिकीय रिपोर्ट का उपयोग करके कवर नहीं किया गया है।मैं फ़ायरबर्ड 2.1 डेटाबेस पर ब्लॉब्स द्वारा ली गई जगह की मात्रा को कैसे माप सकता हूं?

मेरे पास सर्वर के डेस्कटॉप तक आसान पहुंच नहीं है, इसलिए यूडीएफ आदि स्थापित करना एक अच्छा समाधान नहीं है।

मैं इसे आसानी से कैसे कर सकता हूं?

उत्तर

7

आप नीचे दिए गए बयान के साथ एक डेटाबेस में सभी ब्लॉब क्षेत्रों का कुल आकार भरोसा कर सकते हैं:

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

आखरी की कोड उदाहरण संशोधित प्रत्येक ब्लॉब मैदान के आकार को दिखाने के लिए, न केवल सभी धब्बे का योग ।

और एसईटी टर्म का उपयोग किया गया ताकि आप & कॉपी कर सकें इस स्निपेट को सीधे 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 ;# 

यह उदाहरण ऑर्डर द्वारा काम नहीं करता है, शायद बिना किसी ब्लॉक के एक और सुरुचिपूर्ण समाधान मौजूद है।