oracle分区表创建(自动按年、月、日分区)实战

这篇具有很好参考价值的文章主要介绍了oracle分区表创建(自动按年、月、日分区)实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。

  oracle 11g 支持自动分区,不过得在创建表时就设置好分区。

  如果已经存在的表需要改分区表,就需要将当前表 rename后,再创建新表,然后复制数据到新表,然后删除旧表就可以了。

一、为什么要分区(Partition)

  1、一般一张表超过2G的大小,ORACLE是推荐使用分区表的。

  2、这张表主要是查询,而且可以按分区查询,只会修改当前最新分区的数据,对以前的不怎么做删除和修改。

  3、数据量大时查询慢。

  4、便于维护,可扩展:11g 中的分区表新特性:Partition(分区)一直是 Oracle 数据库引以为傲的一项技术,正是分区的存在让 Oracle 高效的处理海量数据成为可能,在 Oracle 11g 中,分区技术在易用性和可扩展性上再次得到了增强。

  5、与普通表的 sql 一致,不需要因为普通表变分区表而修改我们的代码。

二、oracle 11g 如何按天、周、月、年自动分区

2.1 按年创建

numtoyminterval(1, 'year')

--按年创建分区表

create table test_part

(

   ID NUMBER(20) not null,

   REMARK VARCHAR2(1000),

   create_time DATE

)

PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))

(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

--创建主键

alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

-- Create/Recreate indexes

create index test_part_create_time on TEST_PART (create_time);

2.2 按月创建

numtoyminterval(1, 'month')

--按月创建分区表

create table test_part

(

   ID NUMBER(20) not null,

   REMARK VARCHAR2(1000),

   create_time DATE

)

PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))

(partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

--创建主键

alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

2.3 按天创建

NUMTODSINTERVAL(1, 'day')

--按天创建分区表

create table test_part

(

   ID NUMBER(20) not null,

   REMARK VARCHAR2(1000),

   create_time DATE

)

PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL(1, 'day'))

(partition part_t01 values less than(to_date('2018-11-12', 'yyyy-mm-dd')));

--创建主键

alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

2.4 按周创建

NUMTODSINTERVAL (7, 'day')

--按周创建分区表

create table test_part

(

   ID NUMBER(20) not null,

   REMARK VARCHAR2(1000),

   create_time DATE

)

PARTITION BY RANGE (CREATE_TIME) INTERVAL (NUMTODSINTERVAL (7, 'day'))

(partition part_t01 values less than(to_date('2018-11-12', 'yyyy-mm-dd')));

--创建主键

alter table test_part add constraint test_part_pk primary key (ID) using INDEX;

2.5 测试

可以添加几条数据来看看效果,oracle 会自动添加分区。

--查询当前表有多少分区

select table_name,partition_name from user_tab_partitions where table_name='TEST_PART';

--查询这个表的某个(SYS_P21)里的数据

select * from TEST_PART partition(SYS_P21);

三、numtoyminterval 和 numtodsinterval 的区别 

3.1 numtodsinterval(<x>,<c>) ,x 是一个数字,c 是一个字符串。

把 x 转为 interval day to second 数据类型。

常用的单位有 ('day','hour','minute','second')。

测试一下:

 select sysdate, sysdate + numtodsinterval(4,'hour') as res from dual;

结果:

oracle分区表创建(自动按年、月、日分区)实战

3.2 numtoyminterval (<x>,<c>)

将 x 转为 interval year to month 数据类型。

常用的单位有 ('year','month')。

测试一下:

select sysdate, sysdate + numtoyminterval(3, 'year') as res from dual;

结果:

oracle分区表创建(自动按年、月、日分区)实战

四、默认分区

4.1 partition part_t01 values less than(to_date('2018-11-01', 'yyyy-mm-dd'))

表示小于 2018-11-01 的都放在 part_t01 分区表中。

五、给已有的表分区

需要先备份表,然后新建这个表,拷贝数据,删除备份表。

-- 1. 重命名

alter table test_part rename to test_part_temp;

-- 2. 创建 partition table

create table test_part

(

   ID NUMBER(20) not null,

   REMARK VARCHAR2(1000),

   create_time DATE

)

PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'month'))

(partition part_t1 values less than(to_date('2018-11-01', 'yyyy-mm-dd')));

-- 3. 创建主键

alter table test_part add constraint test_part_pk_1 primary key (ID) using INDEX;

-- 4. 将 test_part_temp 表里的数据迁移到 test_part 表中

insert into test_part_temp select * from test_part;

-- 5. 为分区表设置索引

-- Create/Recreate indexes

create index test_part_create_time_1 on TEST_PART (create_time);

-- 6. 删除老的 test_part_temp 表

drop table test_part_temp purge;

-- 7. 作用是:允许分区表的分区键是可更新。

-- 当某一行更新时,如果更新的是分区列,并且更新后的列植不属于原来的这个分区,

-- 如果开启了这个选项,就会把这行从这个分区中 delete 掉,并加到更新后所属的分区,此时就会发生 rowid 的改变。

-- 相当于一个隐式的 delete + insert ,但是不会触发 insert/delete 触发器。

alter table test_part enable row movement;

 六、全局索引和 Local 索引

我的理解是:

  当查询经常跨分区查,则应该使用全局索引,因为这是全局索引比分区索引效率高。

  当查询在一个分区里查询时,则应该使用 local 索引,因为本地索引比全局索引效率高。文章来源地址https://www.toymoban.com/news/detail-432936.html

到了这里,关于oracle分区表创建(自动按年、月、日分区)实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive分区表实战 - 多分区字段

    本实战教程通过一系列Hive SQL操作,演示了如何在大数据环境下创建具有省市分区的大学表,并从本地文件系统加载不同地区的学校数据到对应分区。首先,创建名为 school 的数据库并切换至该数据库;接着,在数据库中定义一个名为 university 的分区表,其结构包括ID和名称两

    2024年01月15日
    浏览(49)
  • pg 创建分区表 --chatGpt

    问:postgreSql 创建表 addresses(id,mkey,pri,addr),其中 id自增且id值会超过上百亿,mkey长度为8且唯一的字符串,pri长度64的字符串,addr长度64的字符串,用散列分区的方式创建 gpt: 你可以使用 PostgreSQL 来创建一个包含散列分区的表 `addresses`,满足你的需求。下面是一个示例的表定义:

    2024年02月09日
    浏览(45)
  • HiveSQL分区的作用及创建分区表案例演示(图解)

    目录 一、分区的作用 二、单级分区表 1.准备工作 2.创建数据表 3.查询数据 4.创建分区数据表 5.添加数据 5.1添加方式1:静态分区(需要指定分区字段和值) 5.2添加方式2:动态分区(只需指定分区字段,分区字段相同的数据自动分配到同一个区) 三、多级分区表 1.准备工作 2.创建分区

    2024年01月17日
    浏览(54)
  • PostgreSQL按日期列创建分区表

          在PostgreSQL中,实现自动创建分区表主要依赖于表的分区功能,这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据,通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤: 首先,你需要创建一个父表

    2024年02月21日
    浏览(44)
  • postgres分区表的创建-基于继承

    参考文档: http://postgres.cn/docs/12/ddl-partitioning.html 创建基于继承的分区表的步骤 1 创建父表 2 创建子表,从父表继承过来 3 创建函数及触发器,使插入的数据根据规则,插入到对应的子表中  -- 创建父表 -- 创建分区表,5个分区  -- 创建触发器函数,针对不同月份的数据,落入

    2023年04月09日
    浏览(42)
  • Hive创建分区表并插入数据

    业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史数据。 分区表的创建本质是在HDFS创建了一

    2024年02月07日
    浏览(51)
  • Oracle 知识篇+分区表上的索引由global改为local注意事项

    ★ 知识点 ★ 注意事项 ★ 相关SQL ★ 测试案例 ※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

    2024年02月13日
    浏览(47)
  • Hive创建分区表时提示错误,java面试线程池

    at org.apache.hadoop.hive.ql.parse.HiveParser.alterTableStatementSuffix(HiveParser.java:7971) at org.apache.hadoop.hive.ql.parse.HiveParser.alterStatement(HiveParser.java:7447) at org.apache.hadoop.hive.ql.parse.HiveParser.ddlStatement(HiveParser.java:4337) at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:2494) at org.apache.hadoop

    2024年04月10日
    浏览(52)
  • Iceberg从入门到精通系列之五:Zeppelin集成iceberg,创建iceberg普通表和分区表,并插入数据

    Zeppelin支持Flink SQL Flink SQL支持iceberg Zeppelin集成Flink SQL后,就可以在Zeppelin上创建iceberg表了 下面演示下Zeppelin集成iceberg后,创建表,插入数据的方便性。

    2024年02月11日
    浏览(48)
  • 【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function

    首先声明下我这边使用的mysql版本是5.7.29版本,当然下面的问题我这边也是基于这个版本。这里因为没有考证其他版本是否也会有这些问题,可自行官方文档来查阅资料 一个唯一键必须包含表分区函数所有的列,根据这个错误提示我们大概就知道怎么处理,但是why?我们还是沉

    2024年02月06日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包