2011-05-03 25 views

回答

17
select vsize(col1) + vsize(col2) + vsize(col3) + 
long_raw_length_function(long_col) + DBMS_LOB.GETLENGTH(blob_col) 
from table 
where id_col = id_val; 

long_raw_length_function,看到這個Get the LENGTH of a LONG RAW

+0

是'herp/derp'替代'foo/bar'作爲代碼中的任意示例嗎? – xdumaine 2011-05-03 15:10:31

+1

'herp/derp'明顯更具貶義性,所以我認爲不是。 – 2011-05-03 15:11:23

+0

謝謝,但如果其中一列是長生的呢? – danboh 2011-05-03 15:11:53

5

如果你有興趣的平均行長度,你可以分析表(與DBMS_STATS包),然後查詢ALL_TABLES.avg_row_len

+0

它可能會返回比以字節爲單位的列長度總和更低的值。它是否反映了平均行所佔用的實際磁盤存儲空間? – Olexa 2015-02-04 09:55:53

+1

@olexa:看起來'avg_row_len'列考慮到[數據佔用的實際空間](https://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:1041629603947)。在大多數情況下,它應該大於各列大小總和的平均值,因爲列級別的開銷很小(例如:當不在行末時,NULL值會佔用空間)。當然,如果你使用壓縮,它可能會更低。 – 2015-02-04 10:45:13

3

下面是我已修改的查詢以獲取表格行長度,當您沒有任何數據時。這可以幫助您進行容量規劃環境設置:

SET serveroutput ON linesize 300 
DECLARE 
    v_max_size  NUMBER := 0; 
    v_owner   VARCHAR2(30); 
    v_table_name  VARCHAR2(30); 
    v_data_type  VARCHAR2(30); 
    v_data_length NUMBER := 0; 
    v_data_precision NUMBER := 0; 
    CURSOR CUR_TABLE 
    IS 
    SELECT DISTINCT table_name 
    FROM all_tab_columns 
    WHERE owner='TMS_OWNER' 
    AND table_name NOT LIKE 'VIEW%' 
    ORDER BY table_name; 
BEGIN 
    FOR Tab IN CUR_TABLE 
    LOOP 
    v_table_name := Tab.table_name; 
    v_max_size := 0; 
    FOR i  IN 
    (SELECT owner, 
     table_name, 
     data_type, 
     data_length, 
     data_precision 
    FROM all_tab_columns 
    WHERE owner ='TMS_OWNER' 
    AND table_name = v_table_name 
    ) 
    LOOP 
     IF i.data_type = 'NUMBER' THEN 
     v_max_size := (v_max_size + i.data_precision); 
     ELSE 
     v_max_size := (v_max_size + i.data_length); 
     END IF; 
    END LOOP; 
    dbms_output.put_line(chr(10)); 
    dbms_output.put_line('Table ='||v_table_name||', Max Record Size = '||v_max_size||' bytes'); 
    END LOOP; 
END; 
/
相關問題