为什么 Oracle 指示我的表使用的空间如此之少?

pac*_*low 3 oracle

我正在运行 Oracle 11g。我有一个包含两个 BLOB 列的表。我在表中插入了 10,000 行,每列包含一个大小为 10289 的字节数组。

如您所见,表中有 10,000 行,每列有 10,289 个字节:

SQL> select count(*) from MYUSER.MYTABLE;

  COUNT(*)
----------
     10000

SQL> select min(length(COL1)), min(length(COL2)) from MYUSER.MYTABLE;

MIN(LENGTH(COL1))      MIN(LENGTH(COL2))
-----------------      -----------------
            10289                  10289
Run Code Online (Sandbox Code Playgroud)

因此,该表应至少使用 205MB 的空间(10289 字节 * 2 * 10000)。

But I used the query given here to find out how much space the table is using, and I got the following:

SQL> SELECT SUM(bytes), SUM(bytes)/1024/1024 MB FROM dba_extents WHERE owner = 'MYUSER' AND segment_name = 'MYTABLE';

SUM(BYTES)         MB
---------- ----------
   2097152          2
Run Code Online (Sandbox Code Playgroud)

Why does it say the table is using up just 2 MB when it should be using up 250 MB?

The byte arrays I'm inserting are compressed data, so Oracle couldn't possibly be compressing that data any further.

Jus*_*ave 5

您的表的段只有 2 MB。其余数据存储在与表段物理分离的 LOB 段中。

SELECT column_name, segment_name
  FROM dba_lobs
 WHERE owner = 'MYUSER'
   AND table_name = 'MYTABLE'
Run Code Online (Sandbox Code Playgroud)

应该显示有两个与该表关联的 LOB 段。然后您可以查询dba_segments以获取这些段的大小

SELECT sum(bytes)/1024/1024 mb
  FROM dba_segments
 WHERE owner = 'MYUSER'
   AND segment_name IN (SELECT segment_name
                          FROM dba_lobs
                         WHERE owner = 'MYUSER'
                           AND table_name = 'MYTABLE')
Run Code Online (Sandbox Code Playgroud)