Oracle非分区表

一、概念

非分区表(Non-partitioned table)是指在创建表时没有使用分区(Partitioning)功能进行数据划分的表。分区表是将表中的数据按照某个特定的列或表达式进行划分,并存储在不同的分区中。而非分区表则没有进行这样的划分,所有的数据存储在一个统一的存储空间中。

非分区表相对于分区表而言,没有分区带来的额外管理和维护的复杂性,因此在某些场景下更加简单和适用。以下是一些非分区表的特点和使用场景:

  1. 简单管理:非分区表不需要定义分区策略、分区键等参数,不需要对分区进行维护,因此管理起来更加简单。
  2. 查询灵活性:由于所有数据都存储在一个统一的存储空间中,查询时不需要指定特定的分区或分区条件,因此查询语句可以更加简洁和灵活。
  3. 数据迁移和备份:非分区表的数据迁移和备份相对较为简单,不需要考虑多个分区之间的数据迁移和备份。
  4. 小规模数据集:非分区表适用于小规模的数据集,当数据量较小且不需要按照特定的列进行分区时,非分区表是一个简单且有效的选择。

然而,非分区表也有其局限性。当数据量非常大,或者需要按照某个特定的列进行数据划分以提高查询性能时,分区表可能更加适合。此外,分区表还提供了更好的数据管理和维护选项,比如可以根据需求对某个特定的分区进行备份、压缩、重建等操作。

二、演示

比如现在是自己定义的一个用户DOG,我现在要查询Dog用户的数据存放在哪些表空间当中。

-- 查询dog用户的数据存放在哪个空间中
SELECT segment_name,tablespace_name,extents,blocks FROM dba_segments WHERE owner = 'DOG'

SEGMENT_NAME

TABLESPACE_NAME

EXTENTS

BLOCKS

EMPLOYEES

SYSTEM

1

8

BIN$/PVtIp3yUWbgUBGsAgACNg==$0

USERS

1

8

BIN$/PVtIp3zUWbgUBGsAgACNg==$0

USERS

1

8

ORDERS

USERS

1

8

CUSTOMERS

USERS

1

8

我这个是模拟的数据,要知道当你接手之前的老的数据,很有可能一个用户名下面全部都是在system中的,这也就是导致系统表空间增长的过于太快了。

-- 查询哪些段是表,哪些段是索引
SELECT object_id,object_name,object_type,status,created FROM dba_objects WHERE owner = 'DOG'

OBJECT_ID

OBJECT_NAME

OBJECT_TYPE

STATUS

CREATED

75079

EMPLOYEES

TABLE

VALID

2023/5/30 15:50

75105

CUSTOMERS

TABLE

VALID

2023/5/31 10:53

75104

ORDERS

TABLE

VALID

2023/5/31 10:53

75187

pk_emp1

INDEX

VALID

2023/5/31 13:14

这里能够查看到哪些是索引,哪些是表。

知道索引还不够, 还想知道这些索引是基于哪些表上的。

-- 索引是基于哪些表
SELECT index_name,table_name,tablespace_name,status FROM dba_indexes WHERE owner = 'DOG'

INDEX_NAME

TABLE_NAME

TABLESPACE_NAME

STATUS

pk_emp1

EMPLOYEES

USERS

VALID

valid:有效的, 这个时候的索引是有效的。

然后开始迁移表,将dog下的EMPLOYEES这个表吧从系统空间移出去。

ALTER TABLE DOG.EMPLOYEES move tablespace users;

> OK
> 时间: 0.05s

然后在查询一下:

SELECT segment_name,tablespace_name,extents,blocks FROM dba_segments WHERE owner = 'DOG'

这个时候,空间已经变了

SEGMENT_NAME

TABLESPACE_NAME

EXTENTS

BLOCKS

EMPLOYEES

USERS

1

8

这个时候我们基本上已经迁移成功了,但是会遇到一个很大的问题

还记得我们这个表是有索引的吗?

SELECT index_name, table_name, uniqueness, status FROM all_indexes WHERE owner = 'DOG'

INDEX_NAME

TABLE_NAME

UNIQUENESS

STATUS

pk_emp1

EMPLOYEES

NONUNIQUE

UNUSABLE

UNUSABLE:这个时候,这个表之前设置的索引已经是无效的了,你要是这个时候当任务完成的时候,麻烦就大了。

之后要是用DDL语句重新使这个索引生效。

Oracle11g我用的是此版本,9i版本移动索引请使用下面

ALTER INDEX dog.pk_emp1 REBUILD TABLESPACE INDX;
> ORA-01418: specified index does not exist,oracle会一直报错这个,当你使用11g的版本的时候

oracle11g版本请使用下列sql

alter index DOG."pk_emp1" rebuild;

这样子才会使得索引重建。

INDEX_NAME

TABLE_NAME

TABLESPACE_NAME

STATUS

pk_emp1

EMPLOYEES

USERS

VALID

最终完成了表空间的迁移, 以及索引的迁移。

迁移前和迁移后一毛一样。
oracle数据库表的迁移也不过如此。