`
beyondJava
  • 浏览: 1709 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

Oracle10g大表查询优化

阅读更多
Oracle10g大表查询优化
对于Oracle中的大表,我们可以采用分区表的方式进行优化,以提高访问表的性能。
以下是对长庆物资系统的BILL表的优化过程:
分析:
BILL表有129个字段,24万多条数据。
虽然数据量不是很大,但是字段过多,造成了读取表的效率不高,经常出现资源竞争频繁,I/O阻塞。
因此有必要对BILL表进行优化,提高效率。
对大表一般采用分区表的方式进行优化,由于Oracle没有提供直接将普通表转变为分区表的方式,必须通过重建表的方式进行优化,一般有三种方式实现,根据不同情况使用,
第一种:利用原表重建分区表,方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了;缺点是对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。
第二种:使用交换分区的方法,只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失;缺点是仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低;适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。
第三种:使用在线重定义的方法,保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作;缺点是实现上比上面两种略显复杂。
由于我们是在生产系统上进行优化,必须保证数据的完整性,所以选择第三种方式进行优化,优化过程:
1、创建一个中间表,这个表要和BILL表的结构一致。
create table BILL_TEST
(
  BILL_ID            CHAR(8) not null,
  PLAN_MAKE_TIME     DATE,
  UP_TIME            DATE not null,
  UP_NAME            VARCHAR2(80),
  SHENPI_PERSON      VARCHAR2(20),
  UP_MODE            VARCHAR2(10) not null,
  LOW_NAME           VARCHAR2(80),
  LOW_UP_TIME        DATE,
  UP_PERSON          VARCHAR2(20) not null,
  MAX_TYPE           VARCHAR2(50) not null,
  WARE_TYPE_SIZE     VARCHAR2(1000) not null,
  ERJI_WARE_TYPE     VARCHAR2(8) not null,
  ERJI_WARE_NUM      NUMBER(15,4) not null,
  ERJI_NEED_TIME     DATE not null,
  TUIJIAN_CORP       VARCHAR2(20) default 1 not null,
  SUPPLY_PINGKU      CHAR(10) default 0,
  JIHUA_ORDER_TIME   VARCHAR2(20),
  ORDER_TYPE         VARCHAR2(50),
  ORDER_MODE         VARCHAR2(50),
  ORDER_TIME         DATE,
  GET_WARE_TIME      DATE,
  SUPPLY_CORP        VARCHAR2(500),
  CAIGOU_WARE_NUM    NUMBER(10,4),
  CAIGOU_WARE_PRICE  NUMBER(12,3),
  CAIGOU_NEED_TIME   DATE,
  CAIGOU_NEED_ADDR   VARCHAR2(200),
  HETONG_ID          VARCHAR2(100) default 0,
  ZHILIANG_NOTE      VARCHAR2(200),
  ZHILIANG_MONEY     NUMBER(12,2),
  CONTENT            VARCHAR2(200),
  ERJI_WARE          VARCHAR2(100),
  WT_DATE            DATE,
  END_NUM            VARCHAR2(20),
  QICAI_WARE         VARCHAR2(100),
  SCCJ               VARCHAR2(200),
  JHDATE             VARCHAR2(100),
  JHNUM              VARCHAR2(20),
  SHOW               NUMBER(1) default 0,
  JH_ADDR            VARCHAR2(200),
  LAST_PRICE         NUMBER(12,2),
  PRE_PRICE          NUMBER(12,2),
  CLASS_ID           VARCHAR2(20),
  LD_MARK            VARCHAR2(10) default 0,
  ASK_PRICE          NUMBER(12,2),
  PLAN_CODE          VARCHAR2(50),
  ARRIVE_TIME        DATE,
  ARRIVE_WEIGHT      VARCHAR2(50),
  ARRIVE_QUALITY     VARCHAR2(50),
  BILL_STEP          NUMBER(10,2) default 0,
  XJD_CODE           NUMBER(10),
  XJD_DATE           DATE,
  XJD_SUPPLY         VARCHAR2(1000),
  OUT_FLAG           VARCHAR2(2) default 0,
  YY_PRICE           NUMBER(12,2) default 0,
  BASE_BILL          VARCHAR2(8),
  BASE_ID            VARCHAR2(4),
  TECK_ASK           VARCHAR2(4000),
  NEW_WARE_TYPE_SIZE VARCHAR2(1000),
  NEW_ERJI_TYPE_SIZE VARCHAR2(100),
  BIDE_YEAR          VARCHAR2(4),
  BIDE_ID            VARCHAR2(5) default 0,
  BIDE_FINISH        NUMBER(1) default 0,
  YSD_ID             VARCHAR2(1000) default 0,
  BG_TYPE            NUMBER(1) default 0,
  PLAN_CHECK         VARCHAR2(20),
  IF_ENERGY          VARCHAR2(1) default 0,
  LAST_SUPPLY        VARCHAR2(200),
  ASK_STEP           NUMBER(4,1) default 0,
  ASK_END            NUMBER(1) default 1,
  ASK_TIMES          NUMBER(1) default 0,
  CON_END_STEP       NUMBER(1),
  PZ_CODE            VARCHAR2(50),
  FP_CODE            VARCHAR2(100),
  QC_STEP            NUMBER(2) default 0,
  QC_PRICE           NUMBER(12,2),
  QC_SUPPLY          VARCHAR2(200),
  QC_SCCJ            VARCHAR2(100),
  QC_CON_ID          VARCHAR2(20),
  QC_JHDATE          VARCHAR2(100),
  QC_JHADDR          VARCHAR2(100),
  BJ_TYPE            NUMBER(1),
  BJ_INFO            VARCHAR2(100),
  FP_FILE            VARCHAR2(20),
  BJ_FILE            VARCHAR2(100),
  CC_STYLE           NUMBER(1) default 0,
  KROOM_ID           VARCHAR2(40),
  YSOVER             VARCHAR2(10) default 0,
  YSD_SJDHRQ         VARCHAR2(11) default 0,
  YSD_CPH            VARCHAR2(10) default 0,
  YSD_YDH            VARCHAR2(10) default 0,
  YSD_DUN            NUMBER(10,2) default 0,
  YSD_GEN            NUMBER(10,2) default 0,
  YSD_MI             NUMBER(10,2) default 0,
  YSD_SJBGH          VARCHAR2(100) default 0,
  YSD_KS             VARCHAR2(1) default 0,
  FLD_BH             VARCHAR2(2000) default 0,
  WZCD               VARCHAR2(100),
  QC_CODE            NUMBER(10),
  JH_STIME           DATE,
  CG_STIME           DATE,
  LD_STIME           DATE,
  CG_PTIME           DATE,
  JG_PTIME           DATE,
  IF_PRINT           NUMBER(1) default 0,
  KC_PRICE           NUMBER(12,2),
  KC_RATE            NUMBER(8,3),
  KC_ID              NUMBER(8),
  YSD1_FLAG          NUMBER(1) default 0,
  FLD_FLAG           NUMBER(1) default 0,
  YSD2_FLAG          NUMBER(1) default 0,
  OLD_PRICE          NUMBER(12,2),
  TECK_ASK_FILE      VARCHAR2(40),
  ZL_STIME           DATE,
  IF_JS              NUMBER(1),
  SITE_NAME          VARCHAR2(200),
  CLASS_ID_OLD       VARCHAR2(20),
  SD_FLAG            NUMBER(1) default 0,
  DJSD_FLAG          NUMBER(1) default 0,
  CON_JHDATE         DATE,
  CON_CONFIRM_DATE   DATE,
  RETURN_FLAG        NUMBER(1),
  PLAN_TYPE          VARCHAR2(20),
  WW_FLAG            NUMBER(1) default 0,
  YS_FLAG            NUMBER(1) default 0,
  RUN_TIME           DATE,
  OLD_WARE_NUM       NUMBER(15,4),
  JH_CTIME           DATE default sysdate
)
tablespace DEMO_USER
partition by range(up_time)
(
partition p1 values less than (to_date('2002-1-1', 'yyyy-mm-dd')),
partition p2 values less than (to_date('2003-1-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2004-1-1', 'yyyy-mm-dd')),
partition p4 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
partition p5 values less than (to_date('2006-1-1', 'yyyy-mm-dd')),
partition p6 values less than (to_date('2007-1-1', 'yyyy-mm-dd')),
partition p7 values less than (to_date('2008-1-1', 'yyyy-mm-dd')),
partition p8 values less than (maxvalue));
在新建的表中创建8个分区,将每一年的数据放在一个分区中,用up_time字段区分时间段。
2、开始重定向表
begin
dbms_redefinition.can_redef_table('demo_user','bill',dbms_redefinition.cons_use_pk);
dbms_redefinition.start_redef_table('demo_user','bill','bill_test',null,dbms_redefinition.cons_use_pk);
end;
3、创建与BILL_TEST相关联的对象,保持和BILL表的一致
alter table BILL_TEST
  add constraint TEST_BILL_UK21144125351128 unique (PLAN_CHECK)
  using index
  tablespace DEMO_USER;

create index TEST_SY_BILL_BASE_ID on BILL_TEST (BASE_ID)  tablespace DEMO_USER;

create index TEST_SY_BILL_HETONG_ID on BILL_TEST (HETONG_ID) tablespace DEMO_USER;

create index TEST_SY_BILL_MAX_TYPE on BILL_TEST (MAX_TYPE) tablespace DEMO_USER;

create index TEST_SY_BILL_STEP on BILL_TEST (BILL_STEP)  tablespace DEMO_USER;

create index TEST_SY_BILL_UP_TIME on BILL_TEST (UP_TIME)  tablespace DEMO_USER;
4、同步分区表
begin
dbms_redefinition.sync_interim_table('demo_user','bill','bill_test');
end;
5、完成重定向表
begin
dbms_redefinition.finish_redef_table('demo_user','bill','bill_test');
end;
6、删除中间表
drop table bill_test;
至此,完成优化,
分享到:
评论

相关推荐

    Oracle 10g性能优化.pdf

    《Oracle 10g性能优化》一书深入探讨了如何在Oracle 10g数据库环境中实现性能优化,针对企业级应用中的常见问题提供了一系列实用的解决方案。以下是对该主题的关键知识点进行的详细解读: ### 1. Oracle Database ...

    ORACLE11G性能分析及优化对策

    为了有效提升Oracle 11g的性能,DBA和开发人员需要全面掌握数据库的工作原理、查询优化器的行为以及锁机制的应用。通过对这些关键领域的深入了解,可以显著提高系统的响应速度和稳定性,从而为企业带来更大的价值。

    oracle10G和oracle11G的OCI.dll

    在Oracle 10G和11G版本中,oci.dll扮演了至关重要的角色,为应用程序提供了访问数据库的底层接口。Navicat是一款流行的数据库管理工具,它利用oci.dll来连接并操作Oracle数据库。 Oracle 10G是Oracle公司在2003年...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    ### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...

    Oracle 10g数据库海量数据分页查询优化.pdf

    Oracle 10g 数据库海量数据分页查询优化 本文主要介绍 Oracle 10g 数据库中的一种优化的海量数据分页查询解决方案。该方案通过分析传统分页查询技术的不足,融合了多种技术,包括数据库优化策略、SQL 语句优化、...

    让Oracle跑得更快1:Oracle 10g性能分析与优化思路(1)(带详细目录)

    根据提供的标题、描述以及部分上下文内容,我们可以推断出这篇文章主要关注的是Oracle 10g数据库系统的性能分析与优化方法。尽管实际内容部分只包含了重复的博客链接,但基于标题和描述,我们可以构建出一系列关于...

    ORACLE10G 性能优化

    ### ORACLE10G 性能优化 #### 一、Oracle体系结构 Oracle10g数据库的性能优化首先需要理解其基本的体系结构。Oracle体系结构主要包括实例和数据库两大部分。 - **Oracle实例**:是访问数据库的一种方式,每个实例...

    oracle11g 性能优化

    Oracle 11g支持并行查询和DML操作,通过分配多个工作线程来加速处理大数据量任务。正确配置并行度可以显著提升性能,但需注意过度并行可能导致资源竞争。 五、数据库监控与诊断 1. **AWR(Automatic Workload ...

    Oracle10g数据库诊断与优化

    Oracle10g数据库诊断与优化

    oracle 10g 考试题库

    Oracle 10g 是Oracle公司推出的数据库管理系统的一个版本,它在2003年发布,提供了许多增强功能和性能优化,对于数据库管理员(DBA)来说是重要的学习和认证目标。"Oracle OCP"(Oracle Certified Professional)是...

    oracle 11g ,10g软件资源 百度云下载

    4. **分区表压缩**:Oracle 11g支持对分区表进行压缩,从而减少了存储空间的占用,并提高了查询性能。 5. **闪回数据库**:这是一种新的数据库恢复机制,可以在不丢失任何数据的情况下将整个数据库恢复到过去某个...

    Oracle 11g-SQL-优化

    Oracle 11g的SQL优化可以涵盖多个层面,从最初的SQL编写到查询执行计划的选择,再到物理和逻辑结构的调整。以下是一些关键知识点: 1. SQL编写准则:在编写SQL查询时,开发者应当尽量使用标准的SQL编写习惯,避免...

    oracle 10g _64x

    在XML处理方面,Oracle 10g增强了对XML的支持,包括XMLDB,一个内置的XML数据库,可以直接在数据库中存储和查询XML文档,提高了XML数据的处理效率。 最后,Oracle 10g的Management Pack提供了全面的监控和诊断工具...

    Oracle10g数据库优化详解

    ### Oracle10g数据库优化详解 #### 一、基本概念 **1. 实例与数据库** - **实例**: 当数据库启动后,多个进程被加载到内存中并进行协同工作,这些进程及其状态共同组成了一个数据库实例。实例是运行时的概念,...

    Oracle10g性能分析与优化思路.doc

    Oracle 10g性能分析与优化是数据库管理中至关重要的环节,主要涉及到系统设计、代码编写和数据库配置等多个层面。本文件重点讨论了几个关键因素,包括软件架构设计、SQL语句编写及其对数据库性能的影响。 1.1 软件...

Global site tag (gtag.js) - Google Analytics