【发布时间】:2011-05-03 14:51:32
【问题描述】:
这可能吗?或者至少我正在寻找一个表格中所有行大小的列表。
【问题讨论】:
这可能吗?或者至少我正在寻找一个表格中所有行大小的列表。
【问题讨论】:
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
【讨论】:
herp/derp 替换 foo/bar 以获得代码中的任意示例吗?
herp/derp 明显更具贬义,所以我认为不是。
如果您对平均行长感兴趣,可以分析表(使用 DBMS_STATS 包),然后查询 ALL_TABLES.avg_row_len。
【讨论】:
avg_row_len 列考虑了actual space occupied by data。在大多数情况下,它应该大于各个列大小总和的平均值,因为列级别的开销很小(例如:NULL 值在不在行尾时占用空间)。当然,如果您使用压缩,它可能会更低。
下面是我为在没有任何数据时获取表行长度而修改的查询。这可以帮助您进行环境设置的容量规划:
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;
/
【讨论】: