Oracle非分区表
一、概念
非分区表(Non-partitioned table)是指在创建表时没有使用分区(Partitioning)功能进行数据划分的表。分区表是将表中的数据按照某个特定的列或表达式进行划分,并存储在不同的分区中。而非分区表则没有进行这样的划分,所有的数据存储在一个统一的存储空间中。
非分区表相对于分区表而言,没有分区带来的额外管理和维护的复杂性,因此在某些场景下更加简单和适用。以下是一些非分区表的特点和使用场景:
-
简单管理:非分区表不需要定义分区策略、分区键等参数,不需要对分区进行维护,因此管理起来更加简单。
-
查询灵活性:由于所有数据都存储在一个统一的存储空间中,查询时不需要指定特定的分区或分区条件,因此查询语句可以更加简洁和灵活。
-
数据迁移和备份:非分区表的数据迁移和备份相对较为简单,不需要考虑多个分区之间的数据迁移和备份。
-
小规模数据集:非分区表适用于小规模的数据集,当数据量较小且不需要按照特定的列进行分区时,非分区表是一个简单且有效的选择。
然而,非分区表也有其局限性。当数据量非常大,或者需要按照某个特定的列进行数据划分以提高查询性能时,分区表可能更加适合。此外,分区表还提供了更好的数据管理和维护选项,比如可以根据需求对某个特定的分区进行备份、压缩、重建等操作。
二、演示
比如现在是自己定义的一个用户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数据库表的迁移也不过如此。