分区是一把双刃剑 要分区绝对要根据实际情况来分析 而我所遇到的情况及时最利于分区的
sql编程的艺术 作者说过 “对分区表进行查询,当数据按分区键均匀分布时,受益最大。”
而我采用的分区键是日子表的日志插入时间 按照一个月分一区,因为这个表每个月都有基本平衡的频率的数据插入, 这样表中的所有数据就可以均匀的分布到每一区。
令人激动的一天不算之前的学习研究 这个就花了我一下午
之前日志表700多万数据,涉及到日志表的业务查询速度很慢一个月的数据查询也将近30秒左右,研究发现oracle有表分区功能 11G更加有智能按月分区功能 开干:
前提确认能的表可以分区
第一步,先创建分区的表
--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('2012-06-30 15:48:11','yyyy-mm-dd HH24:MI:SS'))
--这是没有做分区的表查询 执行时间 :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('2012-06-01 15:48:03','yyyy-mm-dd HH24:MI:SS')
and sysLog.logTime<=to_date('2012-06-30 15:48:11','yyyy-mm-dd HH24:MI:SS'))
有一个说下新建的分区表我只建了 主键 其他都没弄 因为我发现再建日期索引的话查询速度慢了n多,比老表的速度还要慢,不知道这是什么原因,反正我新建的表就弄了一个主键,view sql的结构是这样的:
-- 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(' 2012-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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(' 2012-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
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('2012-06-01 00:00:00') tablespace system;.....
分区后日志查询速度快的不是一般多啊 !!
分享到:
相关推荐
Oracle Database 11g(简称Oracle11g)是甲骨文公司(Oracle Corporation)推出的一款关系型数据库管理系统。Oracle11g继承了Oracle10g的优秀特性,并在此基础上进行了大量的优化与改进,提供了更强大的数据处理能力...
Oracle 11g是Oracle公司推出的数据库管理系统的一个重要版本,它在数据库管理、性能优化、高可用性、安全性以及数据存储方面都有显著的提升。在这个详细的概述中,我们将深入探讨Oracle 11g的一些核心特性及其重要...
Oracle 11g性能优化是数据库管理员和开发人员在日常工作中必须掌握的关键技能。Oracle数据库是全球广泛使用的大型企业级数据库系统,而11g版本引入了许多新的特性和改进,旨在提升性能、可靠性和可管理性。在这个...
Oracle 11G BIDW 是一款专为数据仓库和商务智能(BI)设计的强大解决方案。该版本不仅在数据库层面提供了诸多增强特性,还进一步提升了对BI应用的支持,旨在为企业提供更高效、易用且全面的数据分析能力。 #### ...
Oracle 11g是一款强大的关系型数据库管理系统,由甲骨文公司开发,广泛应用于企业级数据存储、管理和分析。在2021年的今天,Oracle 11g仍然是许多企业和组织的核心技术,对于IT专业人士来说,掌握Oracle 11g的知识至...
Oracle 10g是Oracle公司推出的数据库管理系统的一个重要版本,其全称为Oracle Database 10g,主要在2003年至2013年间广泛使用。本教材为官方提供的英文版,旨在深入讲解该系统的各个方面,帮助学习者掌握Oracle 10g...
这个系统在Oracle数据库10g版本的基础上,提供了针对数据仓库优化的各种特性和工具,旨在提高数据处理效率,支持复杂的商业智能(BI)需求。 在Oracle10g Data Warehouse中,关键知识点包括: 1. **数据仓库概念**:...
Linux redhat5.6 安装 oracle11g 详细教程 一、 Linux redhat5.6 安装建议 * 在安装 Linux 时,建议选择全部服务,关闭防火墙,关闭 selinux ...* Oracle11g 的高级应用包括:数据仓库、数据挖掘、商业智能等
- **Oracle 11g**:作为Oracle Database的一个重要版本,Oracle 11g引入了许多新功能和改进,旨在提高性能、可用性和安全性。 - **数据库架构**:是指数据库系统的基本设计,包括其物理和逻辑组件。Oracle 11g中的...
- **Oracle 10g数据库第2版**:提高了分区表的数量上限至1百万个分区,极大地扩展了单个表的可管理数据量。 #### Oracle11g数据分区的增强功能 1. **增强的分区管理**:提供了更多的工具和选项来管理分区表,比如...
Oracle Database 11g是Oracle公司推出的一款先进的关系型数据库管理系统,主要针对企业级数据管理需求,提供了众多增强的功能和优化。在这个版本中,Oracle针对数据库管理员(DBA)引入了多项重大改进,旨在提高...
Oracle 11g引入了多项自动化工具和智能顾问,如“SQL优化自学”(SQL Tuning Advisor)、“系统全局区和程序全局区的自动调整”(Automatic SGA and PGA tuning),以及针对分区、数据恢复、流性能和空间管理的新...
#### 十、Oracle 10g 数据仓库的数据挖掘 这部分内容介绍了Oracle 10g数据仓库中的数据挖掘功能,包括数据挖掘的基本概念、Oracle提供的数据挖掘工具及其应用案例。 综上所述,《Oracle 10g数据仓库实践》这本书...
Oracle数据库11g是Oracle公司推出的一款重要的数据库产品,它在数据库的可管理性方面进行了重大的改进。Oracle数据库11g的可管理性主要体现在以下几个方面: 一、自动数据库诊断监视(ADDM) ADDM是一个革命性的...
Chapter 11, Oracle Utilities 第 11 章,Oracle 工具 Chapter 12, Database and Instance Startup and Shutdown 第 12 章,数据库及实例的启动与关闭 Part III Oracle Database Features 第三部分 Oracle 数据库...
《Oracle Concepts 中文版 (10g R2)》是一本深入介绍Oracle数据库核心概念和技术的权威指南。这本书详尽地阐述了Oracle数据库系统的工作原理、管理策略以及使用方法,对于学习和理解Oracle数据库有着极其重要的价值...
尽管后续版本如Oracle 11g、12c等带来了更多新功能,但Oracle 10g的基础架构和设计理念对于理解现代数据仓库仍然具有重要的参考价值。 综上所述,Oracle 10g数据仓库以其强大的功能和技术优势,成为了企业级数据...
《Oracle_Database_9i10g11g编程艺术》是针对Oracle数据库系统的一本深入解析书籍,主要涵盖了从9i到11g版本的编程技术和数据库体系结构。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用...
- **分区的概念**:分区是一种将大表分割成较小部分的技术,可以显著提高查询性能。 - **分区策略**:Oracle支持多种分区策略,如范围分区、列表分区等。 #### 19. 内容管理 - **内容管理解决方案**:Oracle提供了...
- **版本背景**:Oracle 11g是甲骨文公司(Oracle Corporation)推出的一款数据库管理系统,它在2007年发布。作为Oracle 10g的升级版,Oracle 11g在功能上进行了大量的增强和完善。 - **主要特性**: - **分区功能*...