我是数据库世界的新手,目前正在评估在我的新项目中使用Oracle 12c或Postgresql。我在服务器硬件上安装了Oracle 12c,在Windows 7上我的笔记本电脑上安装了Redhat Linux(RHEL 6.5)和Postgresql。我在每个服务器上创建了下表,并使用Java程序将伪数据插入其中。
首先我将数据插入到Postgresql中,程序插入了大约1800万行,磁盘消耗增加了16 GB。相同的程序在Oracle中插入数据,并且发现Oracle仅使用430万行消耗了100 GB的整个表空间限制。 有人可以指导我为什么Oracle会为类似的数据占用这么多的磁盘空间吗?我在Oracle中应该做些什么设置以便它占用更少的磁盘空间?我还没有定义任何索引。
用于在Oracle中创建表的SQL查询如下所示。
CREATE TABLE OCT102014
(
A TIMESTAMP
, B VARCHAR2(1000)
, C VARCHAR2(1000)
, D INT
, E INT
, F INT
, G INT
, H FLOAT
, I VARCHAR2(32000)
, J INT
, K INT
, L INT
, M INT
, N FLOAT
, O VARCHAR2(32000)
, P INT
, Q INT
, R INT
, S INT
, T FLOAT
, U VARCHAR2(32000)
, V VARCHAR2(32000)
, W VARCHAR2(32000)
, primarykey int
);
用于在POSTGRESQL中创建表的SQL查询如下所示。
CREATE TABLE OCT102014
(
A TIMESTAMP
, B INT
, C INT
, D INT
, E INT
, F INT
, G INT
, H FLOAT
, I text
, J INT
, K INT
, L INT
, M INT
, N FLOAT
, O text
, P INT
, Q INT
, R INT
, S INT
, T FLOAT
, U text
, V text
, W text
, primarykey int
);
在第I列,O,U,V和W中,我为示例数据插入程序中的所有行添加完全相同的字符串。 Postgresql是否可能发现out并且只为所有行存储一个副本?这可能是postgresql中磁盘空间消耗低的原因。 Oracle可能没有这样做。请评论。
答案 0 :(得分:0)
如果您创建的初始大小为100GB的表空间,将在磁盘上消耗100GB。
要测量表格本身的大小,您需要查询系统视图USER_SEGMENTS
。
表空间文件的大小 不 反映该表空间中表的大小。
以下将显示当前架构中的表和索引使用的大小:
select segment_name,
segment_type,
sum(bytes) as total_bytes
from user_segments
group by segment_name, segment_type;