【发布时间】:2014-10-14 09:10:26
【问题描述】:
我是数据库领域的新手,目前正在评估在我的新项目中使用 Oracle 12c 或 Postgresql。我在带有 Redhat Linux (RHEL 6.5) 的服务器硬件上安装了 Oracle 12c,并在 Windows 7 上的笔记本电脑上安装了 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 是否有可能发现并为所有行只存储一个副本?这可能是 postgresql 中磁盘空间消耗低的原因。甲骨文可能不会这样做。请发表评论。
【问题讨论】:
-
您测量的是什么?例如,您是否正在查看
dba_segments以获取表格的大小?你能告诉我们你在看什么吗? -
我不知道 dba_segments。我正在检查程序执行后磁盘上的可用空间。在 Windows 中使用 Windows 资源管理器,在 RHEL 上使用 df -h 命令。
-
您是如何创建 Oracle 表空间的(确切的 SQL 语句是什么)?如果您创建了一个 100 GB 的表空间,那么 Oracle 完全有可能在您创建表之前创建了一个 100 GB 的数据文件。如果您只是在操作系统中查看数据文件的大小,那并不能告诉您数据文件中的数据量或表的大小。
-
表空间是使用 TOAD 工具创建的。我没有使用任何 SQL 语句。 TOAD 可能在后面触发了 SQL。我可以看到 oracle 消耗了所有 100 GB,因为我的程序在 430 万行之后无法插入行。
-
TOAD 为您生成了 SQL。这是一个很好的例子,如果您不知道如何使用 SQL 来完成类似的任务,那么您不应该使用 GUI 工具。当您的程序“失败”时,错误消息是什么?
标签: oracle postgresql