热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle11g表智能按月分区

oracle11g表智能按月分区之前日志表700多万数据,涉及到日志表的业务查询速度很慢一个月的数据查询也将近30秒左右,研究发现oracle有表分区功能11G更加有智能按月分区功能开干:前提确认能的表可以分区w...SyntaxHighlighter.all();
oracle 11g表智能按月分区
 
之前日志表700多万数据,涉及到日志表的业务查询速度很慢一个月的数据查询也将近30秒左右,研究发现oracle有表分区功能 11G更加有智能按月分区功能 开干:
前提确认能的表可以分区  www.2cto.com  
 
第一步,先创建分区的表
--INTERVAL分区
--这个其实是范围分区的增强功能,通过这个功能可以实现在需要的时候自动的实现新的分区的添加,从而省去了你不断的ADD或者SPLIT新的分区。
CREATE TABLE SYS_LOG_TEM(pid            NUMBER not null,
  yhdm           VARCHAR2(30),
  bmdm           VARCHAR2(12),
  pdaid          VARCHAR2(512),
  simid          VARCHAR2(50),
  logmodule      VARCHAR2(1),
  logtype        VARCHAR2(4),
  operatetype    CHAR(1),
  methodname     VARCHAR2(100),
  methodinfo     VARCHAR2(2000),
  execstatus     VARCHAR2(1),
  execerrorinfo  VARCHAR2(1000),
  alltimespent   NUMBER,
  proxytimespent NUMBER,
  logcontent     VARCHAR2(4000),
  logtime        DATE default sysdate,
  memo           VARCHAR2(200),
  returnflag     CHAR(1),
  returninfo     VARCHAR2(1000),
  gpsx           VARCHAR2(20),
  gpsy           VARCHAR2(20))
  PARTITION BY RANGE (logtime)
  INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) 
  (PARTITION P1 VALUES LESS THAN (TO_DATE('2012-4-1', 'YYYY-MM-DD')));
 
(因为我表里目前的数据最小的是4月份的,所以我让它从四月份开始分区)
 
第二步,把老的日志表的数据插入到新建的分区表  insert into SYS_LOG_TEM   select * from SYS_LOG;
  insert into SYS_LOG_TEM
  select pid,
         yhdm,
         bmdm,
         pdaid,
         simid,
         logmodule,
         logtype,
         operatetype,
         methodname,
         methodinfo,
         execstatus,
         execerrorinfo,
         alltimespent,
         proxytimespent,
         logcontent,
         nvl(logtime,to_date('2008-06-01 00:00:00','yyyy-MM-dd HH24:mi:ss')),
         memo,
         returnflag,
         returninfo,
         gpsx,
         gpsy
    from SYS_LOG;
 
数据7272844条 总共花了我7分钟多
 
这里之所以对logtim字段做null处理是因为一旦oracle 表做的按月分区就不能让时间字段为null否则 更新的时候会报错 ora-14402 更新分区关键字列将导致分区的更改
update sys_log_tem set logtime=null where logtime=to_date('2008-06-01 00:00:00','yyyy-MM-dd HH24:mi:ss'),不知道有没有别的办法解决这个问题,不过我这样做应该也可以自己取一个自定义时间也是说得过去的
 
经过plsql上的测试
查询速度对比
--做了按每月分区的表查询 执行时间 :0.468秒
select count(pid) from ( select  sysLog.pid,sysLog.yhdm,sysLog.operateType,sysLog.methodName,
sysLog.pdaId,sysLog.simId,sysLog.logContent,sysLog.logModule,sysLog.logTime from sys_log_tem sysLog,
Acl_User u where sysLog.yhdm(+)=u.yhdm  and sysLog.logTime>=to_date('2012-06-01 15:48:03','yyyy-mm-dd HH24:MI:SS')
 and sysLog.logTime<=to_date(&#39;2012-06-30 15:48:11&#39;,&#39;yyyy-mm-dd HH24:MI:SS&#39;))
 --这是没有做分区的表查询   执行时间 :18秒
 select count(pid) from ( select  sysLog.pid,sysLog.yhdm,sysLog.operateType,sysLog.methodName,
sysLog.pdaId,sysLog.simId,sysLog.logContent,sysLog.logModule,sysLog.logTime from Sys_Log sysLog,
Acl_User u where sysLog.yhdm(+)=u.yhdm  and sysLog.logTime>=to_date(&#39;2012-06-01 15:48:03&#39;,&#39;yyyy-mm-dd HH24:MI:SS&#39;)
 and sysLog.logTime<=to_date(&#39;2012-06-30 15:48:11&#39;,&#39;yyyy-mm-dd HH24:MI:SS&#39;))
 
有一个说下新建的分区表我只建了 主键 其他都没弄 因为我发现再建日期索引的话查询速度慢了n多,比老表的速度还要慢,不知道这是什么原因,反正我新建的表就弄了一个主键,view sql的结构是这样的:  www.2cto.com  
-- Create table
create table SYS_LOG
(
  pid            NUMBER not null,
  yhdm           VARCHAR2(30),
  bmdm           VARCHAR2(12),
  pdaid          VARCHAR2(512),
  simid          VARCHAR2(50),
  logmodule      VARCHAR2(1),
  logtype        VARCHAR2(4),
  operatetype    CHAR(1),
  methodname     VARCHAR2(100),
  methodinfo     VARCHAR2(2000),
  execstatus     VARCHAR2(1),
  execerrorinfo  VARCHAR2(1000),
  alltimespent   NUMBER,
  proxytimespent NUMBER,
  logcontent     VARCHAR2(4000),
  logtime        DATE default sysdate,
  memo           VARCHAR2(200),
  returnflag     CHAR(1),
  returninfo     VARCHAR2(1000),
  gpsx           VARCHAR2(20),
  gpsy           VARCHAR2(20)
)
partition by range (LOGTIME)
(
  partition P1 values less than (TO_DATE(&#39; 2012-04-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P22 values less than (TO_DATE(&#39; 2012-05-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P23 values less than (TO_DATE(&#39; 2012-06-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P24 values less than (TO_DATE(&#39; 2012-07-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P25 values less than (TO_DATE(&#39; 2012-08-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P26 values less than (TO_DATE(&#39; 2012-09-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P27 values less than (TO_DATE(&#39; 2012-10-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P28 values less than (TO_DATE(&#39; 2012-11-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P29 values less than (TO_DATE(&#39; 2012-12-01 00:00:00&#39;, &#39;SYYYY-MM-DD HH24:MI:SS&#39;, &#39;NLS_CALENDAR=GREGORIAN&#39;))
    tablespace SYSTEM
    pctfree 10
    pctused 40
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    )
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table SYS_LOG
  add constraint PID primary key (PID)
  using index 
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
 
11g分区表按时间自动创建(Interval Partitioning) 我这个用到了oracle 11G的新特性
INTERVAL分区
这个其实是范围分区的增强功能,通过这个功能可以实现在需要的时候自动的实现新的分区的添加,从而省去了你不断的ADD或者SPLIT新的分区。
如果是9i的话 必须把分区的日期写死 根据你的表里的日志值,因为日志表在实时增加数据,你还得定期去手动新建 新的分区,比如这样alter table sys_log_tem add PARTITION logtime values less than(&#39;2012-06-01 00:00:00&#39;) tablespace system;.....
 
分区后日志查询速度快的不是一般多啊!

推荐阅读
  • 在数据仓库管理中,定时更新程序与查询SQL之间的冲突常常导致性能瓶颈和阻塞问题。为了解决这些问题,通常需要对SQL Server进行详细的性能诊断。常用的诊断工具包括系统动态管理视图(DMVs)和扩展事件(Extended Events),这些工具能够帮助识别和分析性能瓶颈的具体原因,从而采取有效的优化措施。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • SQL Server开发技巧:修改表结构后的视图批量更新方法与实践 ... [详细]
  • SQLSharper 2014 是一款专为 SQL Server Management Studio (SSMS) 设计的功能增强插件,旨在提升 T-SQL 开发者的效率。该插件提供了多种实用工具,包括快速查询数据库对象、详细查看表结构、优化查询结果导出以及自动生成代码等。适用于需要高效管理和开发 SQL 数据库的专业人士。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 基于Java和JSP的电子医疗记录管理平台
    随着信息技术的快速发展,各类管理系统已在各行各业得到广泛应用。传统的人工管理模式已逐渐无法满足现代需求。本文介绍了一种基于Java和JSP技术开发的电子医疗记录管理平台,旨在提高医疗行业的信息化水平和管理效率。该平台通过整合先进的数据库技术和Web开发框架,实现了医疗记录的高效存储、查询和管理,为医护人员提供了便捷的操作界面和强大的数据支持。 ... [详细]
  • 在数据库管理中,计算字段(也称为计算列)是一种重要的技术手段。计算字段通过在表定义中使用表达式或函数,自动生成并存储计算结果,从而提高查询效率和数据一致性。本文将详细介绍计算字段的创建方法、优化技巧及其在实际应用中的案例,帮助读者更好地理解和运用这一功能。 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 最近,我在CentOS 5服务器上成功部署了GForge 5.7 Community Edition。与Advanced Server版本相比,虽然功能略有简化,但仍然能够满足大多数开源项目管理的需求。为了确保数据安全,我开发了一套全自动备份脚本,该脚本能够定期备份GForge的数据和配置文件,并将其存储在远程服务器上,以防止数据丢失。此外,该脚本还具备错误检测和日志记录功能,便于故障排查和维护。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Issue with the Reserved Term HOSTS in System Configuration ... [详细]
  • 在开发系统查询搜索功能时,需注意以下几点以提高信息检索效率:首先,在SQL语句中,每个参数占位符“?”后必须紧跟相应的参数赋值,确保参数与赋值一一对应,避免因参数不匹配导致的错误。其次,进行模糊搜索时,若用户输入通配符“%”,可能会导致全表扫描,因此需要对输入的“%”进行特殊处理或限制,以防止不必要的性能开销。此外,建议使用索引优化查询速度,并合理设计搜索逻辑,以提升用户体验。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
author-avatar
DZ---Shanghai
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有