客观地从Oracle数据库中删除数据

Posted

技术标签:

【中文标题】客观地从Oracle数据库中删除数据【英文标题】:Objectively deleting data from Oracle database 【发布时间】:2014-12-19 19:26:19 【问题描述】:

我有一个包含虚拟数据的基本测试数据库(Oracle XE 11g),我正在尝试对其进行一些基准测试。我不在乎数据会发生什么。

我尝试插入大量数据(大约 25 GB),但遇到了错误,例如:

"...maximum file size of autoextend clause out of range"

但它说它达到了 11 GB,然后停止了。 好吧,没问题,google说我可以跑了:

SELECT * FROM DBA_DATA_FILES;

...然后复制路径,并运行此命令

ALTER DATABASE DATAFILE '/my/path/to/datafile' autoextend on maxsize 30G; 

所以所有这些都奏效了,很酷。现在我需要摆脱现有数据,这些数据都包含在一张表中。

所以我决定跑步:

DROP TABLE my_schema.benchmark_table CASCADE CONSTRAINTS;
COMMIT; 

现在,我假设表和所有数据都消失了,但我使用我列出的第一个命令检查它,它似乎并没有真正删除数据。甲骨文的文档说,再次转向谷歌,我引用:

使用 DROP TABLE 语句将表或对象表移动到回收站或从数据库中完全删除表及其所有数据。

注意: 除非您指定 PURGE 子句,否则 DROP TABLE 语句不会导致空间被释放回表空间以供其他对象使用,并且该空间继续计入用户的空间配额。

哦,所以有一个回收站,这是可以理解的,尽管我认为 commit 会解决这个问题。没问题,我会按照文档运行:

PURGE TABLE my_schema.benchmark_table;

它说它有效?好吧,以防万一,让我们检查一下,所以我运行:

SELECT * FROM RECYCLEBIN;
SELECT * FROM USER_RECYCLEBIN; 

在这两种情况下都提取了 0 行。 “它一定奏效了!”,我说。但现在我运行:

SELECT file_name, bytes, max_bytes FROM DBA_DATA_FILES;

...不幸的是,它在字节列下显示 11xxxxxxxxx,我假设它是使用的字节,在 maxbytes 部分下显示 32xxxxxxxxx。所以分配的磁盘空间仍然没有释放。我需要释放 11 GB 的空间。

我宁愿不删除整个表空间,因为我不想删除已配置的模式、抽象数据类型、索引等。

我到底错过了什么?

【问题讨论】:

ALTER TABLE <tablename> DEALLOCATE UNUSED docs.oracle.com/cd/B28359_01/server.111/b28310/… “我认为是使用的字节数” - 它是磁盘上占用的字节数,而不是数据使用的字节数。如果您要为下一次测试再次填满磁盘空间,那么尝试释放磁盘空间是没有意义的。 @Mihai - 我删除了表,表不再存在,因此 ALTER TABLE 将不起作用 您知道您不能将 25gb 插入 oracle XE 吗?这是你在测试的吗? 【参考方案1】:

dba_data_files 告诉您数据文件有多大。一般来说,这可能与表中的数据量大不相同。

您有一个大小约为 10 GB 的数据文件(基于您发布的 bytes 图)。在该数据文件中,您有 0 个或多个段,每个表一个段(或多或少,分区表或集群或具有延迟创建段的表之类的情况存在例外,但我将忽略这一点)。每个段内有一个或多个范围。每个范围内有许多数据块。每个数据块中包含零行或多行的数据。

删除表后,不再有具有表名称的段(也没有具有表上各种索引名称的段)。假设您在表空间中没有其他段并且在表空间中有一个数据文件(为简单起见),这意味着您有一个 10 GB 的数据文件,其中为段分配了 0 个字节。如果您在同一个表空间中创建另一个表(创建新段),这些段将使用已分配给数据文件的 10 GB 空间。这意味着您可以在 Oracle 不得不增加您的数据文件之前将 10 GB 插入到该新表中。

您可以通过查看dba_segments 来查看表空间中各个段的大小

SELECT owner, segment_name, bytes
  FROM dba_segments
 WHERE tablespace_name = <<name of tablespace>>;

您可以通过查看dba_extents 查看分配给每个段的各种范围。

【讨论】:

以上是关于客观地从Oracle数据库中删除数据的主要内容,如果未能解决你的问题,请参考以下文章

oracle 大数据量 删除插入 有啥影响

无法删除或截断 oracle 中的表

oracle如何查看当前有哪些用户连接到数据库

oracle如何查看当前有哪些用户连接到数据库

如何在oracle中查询每个表的记录条数

如何在oracle中查询每个表的记录条数