Oracle-性能优化篇-分区表

🍓Oracle分区表

  • 📌优点:
    1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度(个人评价只针对条件中带分区字段的查询性能)。
    2. 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用(鸡蛋不放一个篮子里的概念)。
    3. 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可(各数据文件之间相互独立,互不影响)。
    4. 均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能(这个针对整体的查询性能,但是分区必须放在不同的表空间,每个表空间尽量分布在不同的磁盘上,这样可以充分利用各个磁盘的I/O来提高效率)。
  • 📌缺点:
    分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

🍓分区表

🍒范围分区(Range)

适合于有明确的时间线或者表里有能表示范围的字段的大批量数据。

create table T_USERS_INFO(
--userID设置的主键,这里就不展示主键设置语句了
userID number,
name varchar2(100),
age number,
birthday date
)
--范围分区
partition by range(birthday) (
--不想指定分区的表空间,可以去掉tablespace xxx
partition p_2020 values less than(to_date('2021-01-01','yyyy-MM-dd')) tablespace p_userinfo_2020,
partition p_2021 values less than(to_date('2022-01-01','yyyy-MM-dd')) tablespace p_userinfo_2021,
partition p_2022 values less than(to_date('2023-01-01','yyyy-MM-dd')) tablespace p_userinfo_2022,
partition p_max values less than(maxvalue) tablespace p_userinfo_max  --兜底,如果不加这个,超出范围的数据插入则将报错。包括空值都是放到这个兜底里面的。
)

--查询表的分区信息
select table_name,partition_name,tablespace_name from dba_tab_partitions where table_name = 'T_USERS_INFO';

--查询指定分区的数据
select * from T_USERS_INFO partition(p_2022)  
🍒List分区

适合于表里存在固定值的字段,如性别、年级等

create table T_USERS_INFO2(
name varchar2(100),
age number,
sex varchar2(10)
)
--指明它是list分区
partition by list(sex)(
--这里设的是固定值,不是范围
partition p_man values ('男') ,
partition p_woman values('女'),
partition p_max values(default)  --兜底,如果不加这个,超出范围的数据插入则将报错。 包括空值都是放到这个兜底里面的。
)
🍒Hash散列分区

适合于表里没有任何规律的字段。

create table T_USERS_INFO3
(
  name VARCHAR2(100),
  age  NUMBER,
  sex  VARCHAR2(10)
)
--指明它是hash分区
partition by hash (AGE)(
partition P1 tablespace p_user_info_1,
partition P2 tablespace p_user_info_2  --hash散列分区不需要兜底分区
);

🍓引用分区

引用分区是给子表分区,适合与已存在的分区表有关联关系的表。

--创建引用分区,引用分区父表T_USERS_INFO
create table T_USER_PERSON(
userInfoID number not null,
pname varchar2(100),
relation varchar2(100),
--注意:子表的外键必须对应分区父表的主键,但是主键不是必须的分区字段
constraint userid_re foreign key(userInfoID) references T_USERS_INFO(userID)
)
partition by reference(userid_re);

🍓组合分区

根据多个字段进行分区(用于单个字段分区后每个分区的数据依然很多,使用组合分区可以对分区进行再分区)

create table T_USERS_INFO4(
name varchar2(100),
age number,
sex varchar2(10) 
)
--首先按照age范围分区
partition by range(age)
--在age范围分区中再按照sex进行list分区
subpartition by list(sex)(
partition p_18 values less than(18) tablespace p_userinfo4_18(
subpartition p_18_man values ('男') ,
subpartition p_18_woman values ('女'),
subpartition p_18_default values(default) 
),
partition p_30 values less than(30) tablespace p_userinfo4_30(
subpartition p_30_man values ('男') ,
subpartition p_30_woman values ('女'),
subpartition p_30_default values(default) 
),
partition p_50 values less than(50) tablespace p_userinfo4_50(
subpartition p_50_man values ('男') ,
subpartition p_50_woman values ('女'),
subpartition p_50_default values(default) 
),
partition p_70 values less than(70) tablespace p_userinfo4_70(
subpartition p_70_man values ('男') ,
subpartition p_70_woman values ('女'),
subpartition p_70_default values(default) 
),
partition p_max values less than(maxvalue) tablespace p_userinfo4_max(
subpartition p_max_man values ('男') ,
subpartition p_max_woman values ('女'),
subpartition p_max_default values(default) 
)
)

#查询子分区的数据
select * from T_USERS_INFO4 subpartition (p_18_man)

#查询子分区的信息
select table_owner,table_name,partition_name,subpartition_name,tablespace_name from dba_tab_subpartitions where table_name = 'T_USERS_INFO4';

🍓分区索引

分区表一般创建本地索引,本地索引在分区表中就是分区索引,各个分区之间的索引相互独立,可以避免因为删除某个分区而导致索引失效的问题。

--创建本地索引
create index user_info_age on T_USERS_INFO(age) local;

--查看索引状态
--STATUS:索引状态(VALID:有效索引,N/A:有效分区索引,UNUSABLE:无效索引)
--PARTITIONED:是否分区索引
select STATUS, PARTITIONED from all_indexes where table_name = 'T_USERS_INFO'

注意: 唯一索引、主键索引,要创建本地索引时,需要带上分区字段进行创建。

🍓分区的新增与删除

🍒手动新增分区

以时间为范围分区的,随着时间的推移我们需要不断给数据库添加新的分区,或者清理数据库中久远的存量分区。

--新增分区(新增的分区会将P_MAX中符合条件的数据自动归集到该新分区中去)
alter table 表名 split partition P_MAX at(to_date(分区界限的时间,'YYYY/mm/dd')) into (partition 分区名,partition P_MAX);
	--demo
	alter table T_USERS_INFO split partition P_MAX at(to_date('2024-01-01','yyyy-MM-dd')) into (partition p_2023,partition p_MAX);

--删除分区数据
alter table 表名 truncate partition 分区名称;

--删除分区
alter table 表名 drop partition 分区名称;

--注意:truncate和drop都会导致索引失效,建议把分区表的索引建成本地索引(分区索引),防止这种情况发生!
🍒oracle自动创建分区

在创建表时,带上interval(NUMTOYMINTERVAL(1, 'YEAR/MONTH/DAY'))便可以自动创建分区了,加上这个的分区表只需要在创表时创建一个初始分区即可,禁止创建兜底分区与该语句一起使用。

create table T_USERS_INFO(
--userID设置的主键,这里就不展示主键设置语句了
userID number,
name varchar2(100),
age number,
birthday date
)
--范围分区
partition by range(birthday) interval(NUMTOYMINTERVAL(1, 'YEAR'))(
--不想指定分区的表空间,可以去掉tablespace xxx
partition p_2022 values less than(to_date('2023-01-01','yyyy-MM-dd')) tablespace p_userinfo_2022
)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle性能优化数据库管理中至关重要的一项工作。在进行性能优化时,不仅需要优化数据库的结构和配置,还需要针对具体的SQL语句进行优化。 首先,有效地使用索引可以显著提高SQL查询的性能。索引的选择应根据具体的查询需求进行优化,避免过多或不必要的索引。并且,需要定期重新分析和重建索引,以确保索引的统计信息是最新的。 其次,合理地编写SQL语句也是优化的关键。应尽量避免使用全表扫描和复杂的连接操作,可以通过使用合适的连接方式、使用子查询替代连接操作等方式来进行优化。 另外,使用合适的查询计划来提高SQL的执行效率也是一项重要的优化策略。Oracle提供了多种查询计划,如基于成本的优化器、基于规则的优化器等。应根据具体的查询需求选择合适的查询计划,并使用_hint强制指定查询计划,以达到最优的查询性能。 此外,合理地设置适当的内存参数也能提高SQL的性能。Oracle数据库有多个重要的内存参数,如SGA(系统全局区)和PGA(程序全局区)等,需要根据实际情况进行调整,以提高SQL的执行效率和响应速度。 最后,可以通过SQL监控和性能调优工具来定位和解决性能问题。Oracle提供了多种监控工具,如AWR报告、SQL Trace、Explain Plan等,可以通过对这些工具的使用来分析和调优SQL的性能问题。 综上所述,通过合理地使用索引、优化SQL语句、选择合适的查询计划、设置适当的内存参数以及使用监控工具等方法,可以有效地提高Oracle数据库的性能。 ### 回答2: Oracle作为一种关系数据库管理系统,拥有强大的性能优化功能。针对SQL语句的性能优化,常用的方法有以下几种: 1. 优化查询语句:通过优化SQL语句的编写,可以减少查询的时间和资源消耗。例如,避免使用SELECT *,而是明确指定需要查询的字段;使用EXISTS或IN代替NOT EXISTS或NOT IN等。 2. 创建索引:通过创建合适的索引可以加速查询。索引可以提高数据检索的效率,减少全表扫描的开销。但过多的索引会增加数据维护的成本,因此需要根据实际情况选择合适的字段创建索引。 3. 使用分区表:将大表划分为若干个小表,每个小表称为一个分区,可以通过分区表来提高查询效率。适当的分区可以减少查询的数据量,提高查询性能。 4. 优化表结构:合理设计表结构,包括选择合适的字段类型、定义主键和外键等等。避免使用过长的字段、重复的字段等不必要的设计,可以减少存储空间的使用和提高查询效率。 5. 适当使用数据库事务:事务能够保证数据完整性和一致性,但在数据处理量大的情况下,事务的开销也是可忽略不计的。因此,在设计时需要考虑是否需要使用事务,以免造成不必要的开销。 6. 使用优化器: Oracle具有强大的查询优化器,它可以根据语句选择更优的执行计划。通过设置优化器参数,例如统计信息的收集、调整计划的优先级等,可以提高查询的执行效率。 综上所述,在进行Oracle性能优化时,可以通过优化SQL语句、创建索引、使用分区表、优化表结构、适当使用事务和调整优化器参数等方法来提高数据库的查询性能。但需要根据具体情况选择合适的优化方法,并进行合理的测试和监控,以确保优化后的性能达到预期效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值