我正在运行 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.
您的表的段只有 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)