使用LONG RAW确定Oracle表的子集的长度

时间:2018-07-04 06:48:41

标签: oracle oracle11g oracle10g

我正在对外部应用程序使用的Oracle DB中保存的表进行空间消耗分析。确实没有访问基础数据库的权限。 如何使用LONG RAW确定Oracle表子集的长度。它是表总长度的百分比吗?对于如果oracle表占用的总空间为1 GB,记录总数为1,000,0000,并且我想根据选择条件知道200,000条记录使用了多少空间。 它会像记录数量对有效空间的直接百分比那样简单吗? 请赐教。

1 个答案:

答案 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的长度均匀分布,则可以使用您提到的百分比方法。

使用数据类型LONGLONG 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