设为首页 收藏本站
查看: 379|回复: 0

[经验分享] Oracle范围分区应用实例

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-3-23 08:40:27 | 显示全部楼层 |阅读模式
                      概述
    范围分区(Range partition):就是根据表的某个字段的值,以固定的一个范围作为一个分区来划分数据。
实例:
  • 创建销售部门销售数据清单表:
    create table sales_list
    (order_id number(5),
    sales_name varchar2(20),
    order_amount number(10),
    order_date date
    )
    partition by range (order_date)
    (partition sales_201401 values less than(to_date('2014-02-01','yyyy-mm-dd')),
    partition sales_201402 values less than(to_date('2014-03-01','yyyy-mm-dd')),
    partition sales_201403 values less than(to_date('2014-04-01','yyyy-mm-dd')),
    partition sales_201404 values less than(to_date('2014-05-01','yyyy-mm-dd')),
    partition sales_201405 values less than(to_date('2014-06-01','yyyy-mm-dd')),
    partition sales_201406 values less than(to_date('2014-07-01','yyyy-mm-dd')),
    partition sales_201407 values less than(to_date('2014-08-01','yyyy-mm-dd')),
    partition sales_201408 values less than(to_date('2014-09-01','yyyy-mm-dd')),
    partition sales_201409 values less than(to_date('2014-10-01','yyyy-mm-dd')),
    partition sales_201410 values less than(to_date('2014-11-01','yyyy-mm-dd')),
    partition sales_201411 values less than(to_date('2014-12-01','yyyy-mm-dd')),
    partition sales_201412 values less than(to_date('2015-01-01','yyyy-mm-dd')),
    partition sales_201501 values less than(to_date('2015-02-01','yyyy-mm-dd')),
    partition sales_201502 values less than(to_date('2015-03-01','yyyy-mm-dd'))
    );
    创建了14个分区,14个段
    SQL> col partition_name format a20
    SQL> col segment_name format a20
    SQL> select segment_name,partition_name from user_segments where segment_name='SALES_LIST';
    SEGMENT_NAME      PARTITION_NAME
    -------------------- --------------------
    SALES_LIST      SALES_201401
    SALES_LIST      SALES_201402
    SALES_LIST      SALES_201403
    SALES_LIST      SALES_201404
    SALES_LIST      SALES_201405
    SALES_LIST      SALES_201406
    SALES_LIST      SALES_201407
    SALES_LIST      SALES_201408
    SALES_LIST      SALES_201409
    SALES_LIST      SALES_201410
    SALES_LIST      SALES_201411
    SALES_LIST      SALES_201412
    SALES_LIST      SALES_201501
    SALES_LIST      SALES_201502

        14 rows selected.

创建过程用于删除旧的分区并添加新的分区:
CREATE OR REPLACE PROCEDURE drop_add_partition AS
  v_part_name VARCHAR2(100);
  v_next_name VARCHAR2(100);
  v_over_time NUMBER;
  v_string    VARCHAR2(10);
  v_date      DATE;
BEGIN
  SELECT MIN(partition_name)
    INTO v_part_name
    FROM user_tab_partitions
   WHERE table_name = 'SALES_LIST'; --找到当前最早的分区
  SELECT MAX(partition_name)
    INTO v_next_name
    FROM user_tab_partitions
   WHERE table_name = 'SALES_LIST'; --找到当前最晚的分区
  SELECT substr(to_char(add_months(to_date(substr(v_next_name, 7, 6),
                                           'yyyy-mm'),
                                   1),
                        'yyyymmdd'),
                1,
                6)
    INTO v_next_name
    FROM dual; --拼接下一个新的分区的名称串
  SELECT round(months_between(SYSDATE,
                              to_date(substr(v_part_name, 7, 6), 'yyyy-mm')))
    INTO v_over_time
    FROM dual;
  --计算当前时间和最早分区的之间间隔的月数
  v_string := to_char(add_months(to_date(v_next_name, 'yyyy-mm'), 1),
                      'yyyy-mm');
  v_date   := to_date(substr(v_string, 1, 4) || '-' ||
                      substr(v_string, 6, 2) || '-01',
                      'yyyy-mm-dd');
  --拼接新的分区在创建的时候需要指定的截至时间点的串
  IF v_over_time > 12
  THEN
    EXECUTE IMMEDIATE 'alter table sales_list drop partition ' ||
                      v_part_name; --删除旧的分区
    EXECUTE IMMEDIATE 'alter table sales_list add partition SALES_' ||
                      REPLACE(v_next_name, '-', '') ||
                      ' values less than (''' || v_date || ''')'; --添加新的分区
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    --异常处理
    dbms_output.put_line(to_char(SQLCODE));
    dbms_output.put_line(SQLERRM);
END;

SQL> set serveroutput on
SQL> exec drop_add_partition;
PL/SQL procedure successfully completed.
SQL> select segment_name,partition_name from user_segments where segment_name='SALES_LIST';
SEGMENT_NAME      PARTITION_NAME
-------------------- --------------------
SALES_LIST      SALES_201402
SALES_LIST      SALES_201403
SALES_LIST      SALES_201404
SALES_LIST      SALES_201405
SALES_LIST      SALES_201406
SALES_LIST      SALES_201407
SALES_LIST      SALES_201408
SALES_LIST      SALES_201503
SALES_LIST      SALES_201409
SALES_LIST      SALES_201410
SALES_LIST      SALES_201411
SALES_LIST      SALES_201412
SALES_LIST      SALES_201501
SALES_LIST      SALES_201502
14 rows selected.

创建后台作业:
declare
  job number;
begin
  dbms_job.submit(job,'drop_add_partition;',sysdate,'sysdate+1');  --每天运行一次,创建这个job的时候就要执行一次
  commit;
end;
                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-49559-1-1.html 上篇帖子: Oracle数据库监听器引起的安全威胁和防护技术 下篇帖子: oracle中时间转换的问题 Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表