千万级数据,如何做性能优化?分库分表、Oracle分区表?

news2024/11/22 23:43:29

在这里插入图片描述

目录

    • 一、Oracle是如何存储数据的?
      • 1、逻辑存储与物理存储
      • 2、进一步分析它们之间的关系
      • 3、Oracle逻辑数据块
        • (1)块头
        • (2)行数据
        • (3)可用空间
        • (4)致块头增长的原因有:
    • 二、Oracle分区表技术
      • 1、分区表的优缺点
      • 2、何时分区?
    • 三、分区相关的数据字典
    • 四、分区表的分类
      • 1、范围分区
        • (1)按月建表,按天分区
        • (2)建表语句分析
        • (3)插入三条数据
        • (4)查询指定分区
        • (5)添加分区
        • (6)删除分区
      • 2、列表分区
        • (1)列表分区适用于一个字段只有**固定**的几个值,比如类型、月份、课程等。
        • (2)插入三条数据
        • (3)查询列表分区数据
        • (4)如果一个分区的数据量不大,可以合并分区
      • 3、哈希分区
        • (1)上面的诸多参数都可以省略。
        • (2)何时使用hash分区?
        • (3)添加hash分区:
        • (4)不可以删除hash分区
      • 4、范围列表组合分区
        • (1)建表语句
        • (2)插入8条数据
        • (3)查询分区数据
        • (4)添加主分区
        • (5)删除子分区
      • 5、范围哈希组合分区
        • (1)建表语句
        • (2)插入10条数据
        • (3)查询分区数据
      • 6、列表哈希组合分区
        • (1)建表语句
        • (2)插入10条数据
        • (3)查询分区数据
    • 五、对已有表进行分区
      • 1、先创建一张表,再插入200条数据。
      • 2、创建一张新表,建一个范围分区
      • 3、把原表数据插入到新表
      • 4、删除原表、新表改名
      • 5、将一个分区拆分成多个分区,分区界限元素必须是一个:字符串,日期时间或间隔文字。
      • 6、截断分区
      • 7、合并分区
    • 六、小结

大家好,我是哪吒,最近项目有一个新的需求,按月建表,按天分区

不都是分库分表吗?怎么又来个分区?

让我们一起,一探究竟,深入理解一下Oracle分区表技术,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

三分钟你将学会:

  1. Oracle是如何存储数据的?
  2. Oracle分区是什么?
  3. 何时分区?
  4. 分区表的分类都有哪些?
  5. Oracle分区技术实战演练

一、Oracle是如何存储数据的?

1、逻辑存储与物理存储

在国企或者一线大厂,一般都会选择使用Oracle数据库,程序通过mybatis等持久层框架访问Oracle数据库,指定表空间,表空间内包含若干张表,表中存有行数据,行数据以行片段的形式存储在数据库块中,① 当插入的行太大,无法装入单个块时;② 或因为更新的缘故,导致现有行超出了当前空间时 -> 就会发生整个行不存储在一个位置的情况。

Oracle在逻辑上将数据存储在表空间中,在物理上将数据存储在数据文件中。

表空间包括若干个数据文件,这些表空间使用与运行Oracle软件的操作系统一致的物理结构。数据库的数据存储在构成数据库表空间的数据文件中。

临时文件是一个临时表空间的文件;它是通过TEMPFILE选项创建的。临时表空间不包含表,通常用于排序。

在这里插入图片描述

2、进一步分析它们之间的关系

  1. 数据库包含若干个表空间(逻辑存储单元);
  2. 每一个表空间包含很多的Oracle 逻辑数据块,逻辑数据块的大小一般在2 KB 至32 KB,默认8 KB;
  3. Oracle 数据块是逻辑I/O的最小单位;
  4. 特定数目的相邻逻辑块构成了“区”;
  5. 特定逻辑结构分配的一组区构成了一个段;

在这里插入图片描述

3、Oracle逻辑数据块

在这里插入图片描述

数据库块包含块头、行数据、可用空间。

(1)块头

块头包含段类型(如表或索引)、数据块地址、表目录、行目录和事务处理插槽。

每个插槽的大小为24 字节,修改块中的行时会使用这些插槽。

(2)行数据

块中行的实际数据。

(3)可用空间

可用空间位于块的中部,允许头和行数据空间在必要时进行增长。当插入新行或用更大的值更新现有行的列时,行数据会占用可用空间。

(4)致块头增长的原因有:

  1. 行目录需要更多的行条目;
  2. 需要的事务处理插槽数多于最初配置的数目;

块中的可用空间最初是相邻的。但是,删除和更新操作可能会使块中的可用空间变成碎片,需要时Oracle 服务器会接合块中的空闲空间。

二、Oracle分区表技术

分区是指表和索引可以被分成若干个部分,它们拥有相同的逻辑属性和数据结构。所有分区的字段和索引都是一样的。

分区表是将表数据分为若干个可以被单独管理的片,每个片就是一个分区,分一个分区都可以拥有自己的物理属性,比如表空间、事务槽、存储参数、最小区段数等,通过建分区语句指定,提升可用性和存储效率。

每个分区可以被单独管理,降低管理成本和备份成本,提高容错率,避免“一荣既荣,一损俱损”的问题。

1、分区表的优缺点

(1)优点

  1. 可以通过指定分区提高查询性能;
  2. 提高容错率,避免“一荣既荣,一损俱损”的问题;
  3. 降低管理成本;
  4. 降低备份成本;

(2)缺点

普通表和分区表不能直接转换,可以通过数据迁移,再重命名的方式实现,需要重建约束、索引,在创建表时可以添加关键字“parallel compress”并行执行,提高效率,下面会通过SQL实例介绍。

2、何时分区?

单表的数据量如果过大,会影响SQL的读写性能,我们可以通过分库分表的方式解决表性能的问题,Oracle的分区表是将一张大表在物理上分成几个较小的表,从逻辑上看仍然是一张完整的表。这样,每次DML操作只考虑其中一张分区表即可。

那么,临界点是多少呢?

  1. 数量量超过500万且空间占用超过2GB的时候必须分区
  2. 数量量高于100万,低于500万时建议分区;

注意:单个分区的数据可以超过500万,但存储空间不建议超过2GB。

三、分区相关的数据字典

根据数据字典表的前缀不同,可查询的内容及权限有所差异:

  1. DBA_开头:需要DBA权限,查询全库内容;
  2. ALL_开头:查询当前用户权限下的内容;
  3. USER_开头:查询当前用户下的内容;

以下是分区表的一些相关字典表,前缀是“DBA_”、“ALL_”、“USER_”;

  1. 分区表信息字典表:*_PART_TABLES;
  2. 分区信息字典表:*_TAB_PARTITIONS;
  3. 子分区信息字典表:*_TAB_SUBPARTITIONS;
  4. 分区表的分区字段信息字典表:*_PART_KEY_COLUMNS;

四、分区表的分类

在这里插入图片描述

1、范围分区

将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定。

一般选取id或者时间作为范围分区的分区键。

(1)按月建表,按天分区

create table WORKER_202301
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by range (SAVE_DATE)
(
	partition WORKER20230129 values less than (TO_DATE('2023-01-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace MYSPACE
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 80K
      minextents 1
      maxextents unlimited
    ),
  partition WORKER20230130 values less than (TO_DATE('2023-01-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace MYSPACE
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 80K
      minextents 1
      maxextents unlimited
    )
);
create index IDX_WORKER_ID202301 on WORKER_202301 (ID)
  local;
create index IDX_WORKER_ID_NAME202301 on WORKER_202301 (ID, NAME)
  local;

(2)建表语句分析

  1. NLS_CALENDAR=GREGORIAN:用于指定Oracle所使用的日历体系,其取值为Arabic Hijrah、English Hijrah、Gregorian、Japanese Imperial、Persian、ROC Official、Thai Buddha。
  2. tablespace:指定表空间;
  3. pctfree:块保留10%的空间留给更新该块数据使用
  4. initrans:初始化事务槽的个数;
  5. maxtrans:最大事务槽的个数;
  6. storage:存储参数
  7. initial:区段(extent)一次扩展64k
  8. minextents:最小区段数
  9. maxextents unlimited:最大区段无限制

每个块都有一个块首部。这个块首部中有一个事务表。事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定。这个事务表的初始大小由对象的INITRANS
设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)。事务表会根据需要动态扩展,最大达到MAXTRANS
个条目(假设块上有足够的自由空间)。所分配的每个事务条目需要占用块首部中的23~24 字节的存储空间。注意,对于Oracle
10g,MAXTRANS 则会忽略,所有段的MAXTRANS 都是255。

由于oracle块里有一个PCT_free的概念,即oracle会预留块大小的10%作为缓冲,当修改oracle的事务增加时,事务槽向下增长,当更新oracle块的数据时,数据向上增长,PCT_free的空间被压缩。

local索引是针对单个分区表的索引;

在对分区表进行维护操作时需检查索引是否失效,索引失效除了会导致查询慢,还会导致数据写入失败,在ALTER TBALE语法中也可以添加关键字“UPDATE INDEXES”避免维护表时索引失效。

(3)插入三条数据

insert into worker_202301 (id,name,technology,save_date) values ('1','哪吒','java',to_date('2023/1/29 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202301 (id,name,technology,save_date) values ('2','云韵','java',to_date('2023/1/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202301 (id,name,technology,save_date) values ('3','美杜莎','Python',to_date('2023/1/30 00:45:19','yyyy-MM-dd hh24:mi:ss'));

(4)查询指定分区

select * from worker_202301 
partition (WORKER20230129);

跨分区查询时,查询每个分区的数据后使用UNION ALL关键字做集合查询,提高查询效率。

(5)添加分区

ALTER TABLE worker_202301 
ADD PARTITION WORKER20230131 
VALUES LESS THAN 
(TO_DATE(' 2023-02-01 00:00:00', 
'SYYYY-MM-DD HH24:MI:SS', 
'NLS_CALENDAR=GREGORIAN'));

(6)删除分区

ALTER TABLE worker_202301 
DROP PARTITION WORKER20230131;

2、列表分区

(1)列表分区适用于一个字段只有固定的几个值,比如类型、月份、课程等。

create table WORKER_202302
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by list (technology)
(
	partition technology_java values ('java'),
	partition technology_python values ('python'),
	partition technology_c values ('c')
);

create index IDX_WORKER_ID202301 on WORKER_202301 (ID)
  local;
create index IDX_WORKER_ID_NAME202301 on WORKER_202301 (ID, NAME)
  local;

(2)插入三条数据

insert into worker_202302 (id,name,technology,save_date) values ('1','哪吒','java',to_date('2023/2/1 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202302 (id,name,technology,save_date) values ('2','云韵','java',to_date('2023/2/1 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202302 (id,name,technology,save_date) values ('3','美杜莎','python',to_date('2023/2/2 00:45:19','yyyy-MM-dd hh24:mi:ss'));

(3)查询列表分区数据

(4)如果一个分区的数据量不大,可以合并分区

create table WORKER_202303
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by list (technology)
(
	partition technology_java values ('java','python'),
	partition technology_c values ('c','c++')
);

3、哈希分区

范围分区和列表分区都是使用某一个字段进行分区,此字段的分区度大才行,但也会产生诸多问题,比如上述的按技术列表分区,现阶段,Java开发人员明显高于C,此时就会导致分区不均匀的问题。

此时,hash分区闪亮登场,hash分区的好处是让分区更均匀一些。

(1)上面的诸多参数都可以省略。

create table WORKER_202304
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by hash (id)
(
	partition worker_id_1,
	partition worker_id_2,
	partition worker_id_3,
	partition worker_id_4,
);

此时,插入200条数据,id从1到200,验证一下是否均匀。数据条数分别是51、55、61、33。

(2)何时使用hash分区?

  1. 分区键的值最好是连续的;
  2. 分区数量最好是2的n次方,对hash运算更加友好;

(3)添加hash分区:

ALTER TABLE worker_202304 
ADD PARTITION worker_id_5;

刚创建好分区,worker_id_5就有数据了,why?匪夷所思。

添加分区时,所有数据会重新计算hash值,重新分配到不同的分区表中。

(4)不可以删除hash分区

4、范围列表组合分区

(1)建表语句

create table WORKER_202305
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by range (SAVE_DATE) SUBPARTITION BY LIST (technology) 
(
  partition WORKER20230529 values less than (TO_DATE(' 2023-05-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  (
  	 SUBPARTITION technology_java_29 values('java'),
     SUBPARTITION technology_python_29 values('python'),
     SUBPARTITION technology_c_29 values('c')
  ),
  partition WORKER20230530 values less than (TO_DATE(' 2023-05-31 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  (
  	 SUBPARTITION technology_java_30 values('java'),
     SUBPARTITION technology_python_30 values('python'),
     SUBPARTITION technology_c_30 values('c')
  )
);

(2)插入8条数据

insert into worker_202305 (id,name,technology,save_date) values ('101','哪吒','java',to_date('2023/5/29 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('102','云韵','java',to_date('2023/5/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('103','美杜莎','java',to_date('2023/5/29 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('104','哪吒','java',to_date('2023/5/29 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('105','云韵1','python',to_date('2023/5/30 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('106','美杜莎1','python',to_date('2023/5/30 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('107','哪吒1','python',to_date('2023/5/30 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202305 (id,name,technology,save_date) values ('108','云韵1','python',to_date('2023/5/30 22:46:19','yyyy-MM-dd hh24:mi:ss'));

(3)查询分区数据

select count(1) from worker_202305 PARTITION (WORKER20230529);//4条 ok
select count(1) from worker_202305 PARTITION (WORKER20230530);//4条 ok
select count(1) from worker_202305 SUBPARTITION (TECHNOLOGY_JAVA_29);//4条 ok
select count(1) from worker_202305 SUBPARTITION (TECHNOLOGY_JAVA_30);//0条 ok

(4)添加主分区

ALTER TABLE worker_202305 ADD PARTITION WORKER20230531 values less than (TO_DATE(' 2023-06-1 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  (
  	 SUBPARTITION technology_java_31 values('java'),
     SUBPARTITION technology_python_31 values('python'),
     SUBPARTITION technology_c_31 values('c')
  )

为WORKER20230529添加子分区technology_go_29:

ALTER TABLE worker_202305 
MODIFY PARTITION WORKER20230529 
ADD SUBPARTITION technology_go_29 values('go'); 

(5)删除子分区

ALTER TABLE worker_202305 
DROP SUBPARTITION technology_go_29;

5、范围哈希组合分区

(1)建表语句

create table WORKER_202306
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by range (SAVE_DATE) SUBPARTITION BY HASH (id) 
(
  partition WORKER20230628 values less than (TO_DATE(' 2023-06-29 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  (
   SUBPARTITION worker_id_1,
     SUBPARTITION worker_id_2,
     SUBPARTITION worker_id_3,
   SUBPARTITION worker_id_4
  ),
  partition WORKER20230629 values less than (TO_DATE(' 2023-06-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
  (
  SUBPARTITION worker_id_5,
     SUBPARTITION worker_id_6,
     SUBPARTITION worker_id_7,
   SUBPARTITION worker_id_8
  )
);

(2)插入10条数据

insert into worker_202306 (id,name,technology,save_date) values ('101','哪吒','java',to_date('2023/6/28 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('102','云韵','java',to_date('2023/6/28 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('103','美杜莎','java',to_date('2023/6/28 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('104','哪吒','java',to_date('2023/6/28 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('105','云韵1','python',to_date('2023/6/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('106','美杜莎1','python',to_date('2023/6/29 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('107','哪吒1','python',to_date('2023/6/29 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('108','云韵1','python',to_date('2023/6/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('109','云韵1','python',to_date('2023/6/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202306 (id,name,technology,save_date) values ('110','云韵1','python',to_date('2023/6/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));

(3)查询分区数据

select count(1) from worker_202306 PARTITION (WORKER20230628);
select count(1) from worker_202306 PARTITION (WORKER20230629);
select count(1) from worker_202306 SUBPARTITION (worker_id_1);
select count(1) from worker_202306 SUBPARTITION (worker_id_2);
select count(1) from worker_202306 SUBPARTITION (worker_id_5);
select count(1) from worker_202306 SUBPARTITION (worker_id_6);

由于hash分区的缘故,数据分布不均匀。

6、列表哈希组合分区

(1)建表语句

create table WORKER_202307
(
  id        VARCHAR2(100) not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by list (technology) SUBPARTITION BY HASH (id) 
(
  partition technology_java values ('java')
  (
   SUBPARTITION worker_id_1,
     SUBPARTITION worker_id_2,
     SUBPARTITION worker_id_3,
   SUBPARTITION worker_id_4
    ),
  partition technology_python values ('python')
  (
   SUBPARTITION worker_id_5,
     SUBPARTITION worker_id_6,
     SUBPARTITION worker_id_7,
   SUBPARTITION worker_id_8
    )
);

(2)插入10条数据

insert into worker_202307 (id,name,technology,save_date) values ('101','哪吒','java',to_date('2023/7/28 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('102','云韵','java',to_date('2023/7/28 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('103','美杜莎','java',to_date('2023/7/28 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('104','哪吒','java',to_date('2023/7/28 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('105','云韵1','python',to_date('2023/7/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('106','美杜莎1','python',to_date('2023/7/29 00:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('107','哪吒1','python',to_date('2023/7/29 22:45:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('108','云韵1','python',to_date('2023/7/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('109','云韵1','python',to_date('2023/7/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));
insert into worker_202307 (id,name,technology,save_date) values ('110','云韵1','python',to_date('2023/7/29 22:46:19','yyyy-MM-dd hh24:mi:ss'));

(3)查询分区数据

select count(1) from worker_202307 PARTITION (technology_java);
select count(1) from worker_202307 PARTITION (technology_python);
select count(1) from worker_202307 SUBPARTITION (worker_id_1);
select count(1) from worker_202307 SUBPARTITION (worker_id_2);
select count(1) from worker_202307 SUBPARTITION (worker_id_5);
select count(1) from worker_202307 SUBPARTITION (worker_id_6);

五、对已有表进行分区

1、先创建一张表,再插入200条数据。

create table WORKER_202308
(
  id        number not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)

2、创建一张新表,建一个范围分区

create table WORKER_202308_tab
(
  id        number not null,
  name      VARCHAR2(200),
  technology      VARCHAR2(100),
  save_date DATE
)
partition by range (id)
(
  partition WORKER1 values less than (201)
);

3、把原表数据插入到新表

select * from WORKER_202308;
select * from WORKER_202308_tab;

ALTER TABLE WORKER_202308_tab
  EXCHANGE PARTITION WORKER1
  WITH TABLE WORKER_202308
  WITHOUT VALIDATION;

成功转移。

4、删除原表、新表改名

DROP TABLE WORKER_202308;
RENAME WORKER_202308_tab TO WORKER_202308;

5、将一个分区拆分成多个分区,分区界限元素必须是一个:字符串,日期时间或间隔文字。

在这里插入图片描述

AT括号内不能是字段名称,改为数字即可。

ALTER TABLE WORKER_202308 
SPLIT PARTITION WORKER1 AT (180) 
INTO (PARTITION WORKER2,PARTITION WORKER3);

注意:不能修改分区列的数据类型

通过sql查询验证分区是否成功。

SELECT * FROM USER_TAB_PARTITIONS 
WHERE TABLE_NAME='WORKER_202309';

通过sql查询分区数据:

select count(1) from WORKER_202309 
PARTITION (WORKER1);//分区不存在 ok

select count(1) from WORKER_202309 
PARTITION (WORKER2);//179条数据 ok

select count(1) from WORKER_202309 
PARTITION (WORKER3);//21条数据 ok

6、截断分区

截断分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。

ALTER TABLE WORKER_202309 
TRUNCATE PARTITION WORKER3;

7、合并分区

ALTER TABLE WORKER_202309 
MERGE PARTITIONS WORKER2,WORKER3 
INTO PARTITION WORKER3 ;

六、小结

使用Oracle这么久,第一次系统的了解Oracle的存储结构,Oracle -> 表空间 -> 段 -> 区 -> 逻辑数据块

了解了Oracle分区表技术适用于哪些场景、何时分区、分区表的分类,并通过SQL实例进行了实战演练。


在这里插入图片描述

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

Java基础教程系列

Java高并发编程系列

数据库进阶实战系列

既然有MySQL了,为什么还要有MongoDB?

一次线上事故,我顿悟了MongoDB的精髓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于我给dumi2.0提pr的完整记

前言 博主最近一年时间在工作业余都在写开源组件库 concis ,其中文档站点生成框架采取了 dumi,前几天不久dumi2.0正式发布,博主也是顺势而为直接把项目升级(dumi1 -> dumi2) 由于dumi2 的站点设计比原来好看太多了…

备忘:收藏栏式的主页

作为从DOS时代过来的骨灰,早期的 Window 出于各种原因需要重装,而重装之后IE的收藏夹全丢了(不可能每次重装之前备份了收藏夹)。所以编程把收藏夹提取出来(当时就是目录结构下的 .lnk 文本内容)转为 myfav.html 作为主页,(不备份目录是为了)方…

eclipse快捷键

Eclipse常用快捷键1几个最重要的快捷键代码助手:CtrlSpace(简体中文操作系统是Alt/)快速修正:Ctrl1单词补全:Alt/打开外部Java文档:ShiftF2显示搜索对话框:CtrlH快速Outline:CtrlO打开资源&…

python时间-time模块

time是python自带的模块,用于处理时间问题,提供了一系列的操作时间的函数。 以下说明针对于 python2.7,其他版本可能有所差异。 模块提供了两个种表示时间的格式: 1.时间戳,是以秒表示从“新纪元”到现在的时间&#x…

代码随想录训练营第16天|104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

104 二叉树的最大深度 看完题后的思路 后续遍历 深度 f(root)终止条件 rootnull return 0递归 if rootnullreturn 0; leftf(root.left); rightf(root.right); return max(left,right)1;思路 节点深度: 该节点到根节点的节点数,某个节点的深度一次就能求出来 节点高度:该节点…

爱因斯坦求和约定:torch/np.enisum

结论:爱因斯坦求和约定就是用来省略求和符号的;所以它的本质是求和运算,它并不能决定具体的运算到底是矩阵乘法,还是内积外积之类的,它所涉及的所谓的矩阵乘法之类的,其实是人为定义的,和它自身…

Java 并发编程(Ⅰ)

目录1. 概念1. 基本概念2. 线程的状态2. 线程的初始化1. new Thread()2. new Thread(new Runnable())3. Thread 和 Runnable 的关系4. new Thread(new FutureTask(new Callable()))3. 常用方法1. start1. 线程组2. start 和 run2. sleep1. TimeUtil2. InterruptedException3. s…

DCMM数据管理能力成熟度认证详解

第一部分:评估基础篇 First part DCMM定义 DCMM是《数据管理能力成熟度评估模型》GB/T 36073-2018国家标准,英文简称:(Data management Capability Maturity Model)。是我国首个数据管理领域正式发布的国家标准。旨在帮…

【ZooKeeper】

1.ZooKeeper是什么? 答: ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户…

100 家企业软件测试笔试面试题汇总(网友真实面试后征集)

目录 一、中科软 二、AURALOG 笔试面试(外企) 三、GWebs 公司笔试题 四、北京麒麟网信息技术有限公司笔试题 五、施惠特 六、总结 一、中科软 笔试题 1.谈谈你对测试的理解2.你三年的职业规划3.你对加班的看法?是否可以加班?4.你心…

推荐系统遇上深度学习(一四二)-[微软复旦]CTR预估中的对比学习框架CL4CTR

今天分享的论文为《CL4CTR: A Contrastive Learning Framework for CTR Prediction》,从特征表示角度入手,将多种对比学习损失引入到CTR预估的模型训练中,一起来看一下。1、背景主流的CTR预估模型大致可以分为两类,一类是传统的模…

【软件测试】遇到新产品的测试就懵了?这三部曲带你轻松快速上手新业务......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 初入一家公司&#…

FreeRTOS互斥量的实验

互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量,它和 信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性, 用于实现对临界资源的独占式处理。本章要实现的功能是&#xf…

算法训练营 day24 回溯算法 回溯算法理论基础 组合

算法训练营 day24 回溯算法 回溯算法理论基础 组合 回溯算法理论基础 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法。 因为回溯的本质是穷举,穷举所有可能&am…

钉钉微应用 - - - - 如何本地开发调试?

钉钉微应用 - 本地开发调试1. 安装DingTalk-Design-CLI2. 初始化代码模版3. 启动开发、调试功能4. 遇到的问题4.1 对应企业没有xxx域名微应用??4.2 history、location的表现异常??4.3 本地已经存在了H5微应用,也想使用…

软件体系结构与架构技术知识点万字总结

文章目录页面技术一、Spring框架1. 三层体系架构2. Spring的核心3. Spring 的Bean中主要的装配方式(1)基于XML的装配:(2)基于Annotation的装配:(3)自动装配:4. Spring框架…

Linux 中启用 SSH 密码登录

Linux 中启用 SSH 密码登录 文章目录Linux 中启用 SSH 密码登录1、更改配置文件2、设置登录密码3、完成1、更改配置文件 首先使用 管理员 权限打开/etc/ssh/sshd_config文件。 sudo vi /etc/ssh/sshd_config找到 PasswordAuthentication 选项,耐心查找。 当然&am…

23种设计模式之十一种行为型模式

23种设计模式之十一种行为型模式1. 设计模式概述1.1 什么是设计模式1.2 设计模式的好处2. 设计原则分类3. 详解3.1 单一职责原则3.2 开闭原则3.3 里氏代换原则3.4 依赖倒转原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特法则4. Awakening1. 设计模式概述 我们的软件开发技术也…

车道线检测源码详解

源码链接见文末 1.车道数据与标签下载 数据下载地址:因为数据的规模比较大,源码中只包含了部分数据,能够供运行代码使用 CULane:https://xingangpan.github.io/projects/CULane.html tusimple:https://github.com/TuSimple/tusimple-benchmark/issues/3 2.项目环境配置 …

数据存储:MySQL之多表连接方式

在我们走出新手村,开始编写系统时,总会遇到各种复杂的场景需要多个数据库表的联查,这时我们就需要掌握多表查询有几种方式,以便我们在各种复杂的应用场景使用适宜的连接方式。 用于测试的表: student表 grade表 syst…