我正在对外部应用程序使用的Oracle DB中保存的表进行空间消耗分析。确实没有访问基础数据库的权限。 如何使用LONG RAW确定Oracle表子集的长度。它是表总长度的百分比吗?对于如果oracle表占用的总空间为1 GB,记录总数为1,000,0000,并且我想根据选择条件知道200,000条记录使用了多少空间。 它会像记录数量对有效空间的直接百分比那样简单吗? 请赐教。
答案 0 :(得分:0)
Oracle保留了大量有关表,索引和内容所用空间的信息。所有占用空间的东西都位于一个段中,该段可在数据字典视图USER_SEGMENTS
中找到:
CREATE TABLE t (i NUMBER, r LONG RAW);
INSERT INTO t (i) VALUES (1);
SELECT segment_type, bytes, blocks FROM user_segments WHERE segment_name='T';
SEGMENT_TYPE BYTES BLOCKS
TABLE 65536 8
因此,一个几乎空的表占用8个8K块,这些块总大小为64 KB。如果您插入一些LONG RAW
测试数据,则大小会相应增加:
INSERT INTO t
SELECT object_id, hextoraw(lpad('AA',1000,'AA'))
FROM all_objects
WHERE ROWNUM <= 10000;
SELECT segment_type, bytes, blocks FROM user_segments WHERE segment_name='T';
SEGMENT_TYPE BYTES BLOCKS
TABLE 6291456 768
最精确的测量是使用您选择的条件创建一个测试表并对其进行测量:
CREATE TABLE testtable NOLOGGING TABLESPACE my_scratch_ts AS
SELECT * FROM my_table WHERE my_column = ...;
如果LONG RAW
的长度均匀分布,则可以使用您提到的百分比方法。
使用数据类型LONG
和LONG RAW
确实很痛苦,这就是Oracle建议不将其用于新项目的原因。您需要在PL / SQL中运行查询以确定实际大小:
DECLARE
s NUMBER := 0;
BEGIN
FOR c IN (SELECT r, -- get the long raw column to measure it's length
vsize(i) as v -- get the size of the other column(s)
FROM t
WHERE i between 1700 and 1800) -- example for your selection
LOOP
s := s + c.v; -- add the lengths other columns
s := s + utl_raw.length(c.r); -- add the length of the long raw
END LOOP;
dbms_output.put_line('total size of selection = '||s||' bytes');
END;
/
在SQL Developer中打开DBMS_OUTPUT
时,它会显示类似以下内容:
total size = 24000 bytes