`
Dead_knight
  • 浏览: 1200959 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240190
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48914
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236876
社区版块
存档分类
最新评论

性能优化(案例一)-横向分表

阅读更多

问题:

项目为工作流系统,工作流核心表涉及三张表,分别为

表A:工单表

表B:工单任务表

表C:工单任务参与表

随着数据量急剧增加,表C达到1亿,表B达到2000万,表A达到500万

此时对这三张表做关联查询时,尽管通过索引以及SQL优化等方式,也无法解决性能问题时

只能对表结构进行切分

 

方案:

数据库分表主要有两种:横向切分、纵向切分

通过分析这三张表主要应用于工作流系统,主要根据表A的endTime字段从数据上可划分为活动数据、不活动数据、历史数据(endTime字段的意义是:如果工单结束,endTime为结束时间)。

活动数据-频繁的查询、增删改操作

不活动数据-查询统计报表操作

历史数据-很少进行查询,一般为几年前的数据

 

实施:

步骤一、

以表A为例,增加archive字段,根据该字段将数据划分为

archive=-1:历史数据

archive=0:不活动数据

archive=1:活动数据

原始表A的定义为:

create table table_A

(

   ID                VARCHAR(128) PRIMARY KEY,

   PARENTID    VARCHAR(128),

   ……

   ENDTIME      VARCHAR(128)

);

改造后的表A定义为:

create table table_A

(

   ID                VARCHAR(128) PRIMARY KEY,

   PARENTID    VARCHAR(128),

   ……

   ENDTIME      VARCHAR(128) ,

   ARCHIVE      NUMBER(1) DEFAULT 1 NOT NULL

);

partition by range (ARCHIVE)
(
  partition SUBS_0 values less than (0)
  partition SUBS_1 values less than (1)
  partition SUBS_2 values less than (2)
);

 

步骤二、

insert、update、delete操作不做改动

对表A的查询操作增加条件(只针对活动数据的查询)

archive=1

 

步骤三、

建立oracle job完成每天数据的自动归档任务

存储过程为:

create or replace procedure PROC_TABLE_A as
  TYPE ridArray IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
  type cur_type is ref cursor;
  v_rid    ridArray;
  v_cursor cur_type;

begin
  dbms_output.put_line(' Start purging finished processes...... ');
  open v_cursor for 'select  ROWID from table_A partition(SUBS_2) where endtime is not null';
  loop
    FETCH v_cursor BULK COLLECT
      INTO v_rid LIMIT 10000;
    forall row in 1 .. v_rid.count()
      UPDATE tbl_process_draft partition(SUBS_2)
         set archive = 0
       where rowid = v_rid(row);
    COMMIT;
    EXIT WHEN v_cursor%NOTFOUND;
  END LOOP;
  close v_cursor;
  dbms_output.put_line(' done! ');

exception
  when others then
    dbms_output.put_line('error is' || sqlcode ||
                         '   error   message   is' ||substr(sqlerrm, 1, 100));
    rollback;
end;

 

job为:

begin
  sys.dbms_job.submit(job => :job,
                      what => 'PROC_TABLE_A;',
                      next_date => to_date('04-05-2011 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'TRUNC(sysdate) + 1 +1/ (24)');
  commit;
end;

有没有搞错,提交之后,发现内容变一半了,只能再把丢掉的内容补上

javaeye,别让我失望!

1
0
分享到:
评论

相关推荐

    mysql大数据分库和分表 php解决方案

    横向分表案例 - 当数据量达到一定程度时(比如单表记录达到百万级别以上),可以考虑进行横向分表。例如,对于博客系统中的文章数据,可以通过用户ID进行模运算分配到不同的子表中。 ```plaintext 示例:假设...

    Asp.Net 网站优化系列之数据库优化 分字诀 分表(纵向拆分,横向分区)

    在上一篇中我们已经讨论了分库的概念,本篇文章将着重讲解另一种重要的数据库优化方法——分表。分表技术可以进一步提高系统的整体性能。其中,**纵向分表**是一种常见的实现方式。 ##### 纵向分表定义 纵向分表指...

    大型网站技术架构:核心原理与案例分析

    在当今数字化时代,大型网站面临诸多挑战,包括高并发访问、海量数据处理、系统稳定性、性能优化以及安全防护等。这本书通过理论与实践相结合的方式,详细讲解了这些核心原理,并提供了丰富的案例分析。 首先,我们...

    Amazon Aurora 数据库服务介绍及案例分享—.pdf

    亚马逊Aurora是一种由亚马逊网络服务(AWS)推出的云数据库服务,设计用于满足大规模、高并发以及对性能和可用性有较高要求的现代互联网应用。它提供与MySQL和PostgreSQL兼容的数据库引擎。Aurora是AWS历史上增长最...

    数据库分库技巧

    因此,为了提升网站性能并实现数据层的横向扩展,采用数据切分技术成为了解决这一问题的关键策略。 数据切分技术主要包括水平切分(Sharding)和垂直切分两种方式。其中,水平切分通过将数据按照某种规则分散到多个...

    mycat权威指南

    在“分表分库”这一核心概念上,Mycat通过将大型数据库横向切分成多个小型数据库,以实现水平扩展,缓解单个数据库的压力。这种方式可以有效地提高数据库系统的读写性能,同时避免单一节点故障导致整个系统服务中断...

    轻量级Java+EE企业应用实战

    通过合理选择技术栈,可以在保证高性能的同时实现系统的横向扩展。例如,使用Spring Cloud可以方便地实现微服务架构,提高系统的响应速度和处理能力。 ### 三、实战案例分析 #### 3.1 微服务架构实践 微服务是一种...

    大规模web服务技术开发

    这通常涉及到分库分表策略、读写分离、数据库缓存、NoSQL数据库的应用等技术,它们能够有效解决数据库性能瓶颈。 5. 编程与算法优化 编程实践中需要关注代码的性能和效率,例如压缩编程可以减少内存和带宽的消耗,...

    董泽润 - Vitess Kingshard中间件的启示

    首先,Vitess是由YouTube开发并开源的数据库分片系统,它允许你以弹性的方式扩展和管理MySQL数据库,使得数据库能够横向扩展,并且能够处理高并发和大数据量的场景。而Kingshard是一个开源的MySQL中间件项目,主要...

    支付宝架构演化(支付软件体系结构演变)

    在支付宝的案例中,软件体系结构经历了从简单到复杂的演进,以适应业务规模的快速增长和用户需求的变化。体系结构定义不仅包括软件的模块划分,还涉及组件的职责分配、接口规范和系统的行为模式。 1. 软件体系结构...

Global site tag (gtag.js) - Google Analytics