`
哇哈哈852
  • 浏览: 94251 次
文章分类
社区版块
存档分类
最新评论

浅析Oracle 11g中对数据列默认值变化的优化

阅读更多
在日常的运维工作中,对生产数据表进行DDL操作是一件需要谨慎对待的事情。运维DBA们在进行数据DDL操作的时候,通常要全局考虑,诸如对生产影响、执行时间长度和影响存储数据等等。

数据列默认值的添加,是DBA们经常头疼的一个问题。传统的执行语句,消耗时间长、资源使用量大,对生产环境影响程度高。采用其他的一些变通方法,又存在操作步骤繁琐的问题。如何快速的添加一个有默认值的数据列,同时对现有生产环境影响最小,是我们希望达到的一个目标。

本文从操作入手,探讨添加default数据列的问题点,最后介绍Oracle 11g中对其进行的“革命性”优化。

1、从10g的数据列添加谈起

为了实现对比效果,我们首选选择10g版本的Oracle进行试验,构造一个相对较大的数据表。


SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE   10.2.0.1.0     Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> create table t as select object_id from dba_objects;
表已创建。

SQL> select count(*) from t;
COUNT(*)
----------
  3220352


数据表t只包括一个数据列,但是数据量大约为320万条。我们从体积上进行评估如下:


SQL> set timing on;
SQL> select bytes/1024/1024,blocks from dba_segments where wner='SYS' and segment_name='T';

BYTES/1024/1024    BLOCKS
--------------- ----------
            39      4992

已用时间: 00: 00: 00.03

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade=>true);
PL/SQL过程已成功完成。

已用时间: 00: 00: 00.35

SQL> select blocks from dba_tables where wner='SYS' and table_name='T';

   BLOCKS
----------
     4883

已用时间: 00: 00: 00.01


Oracle分配给这个段segment的中空间为4992个数据块,高水位线HWM下的格式化过数据块为4883。总体积约40M。

下面进行两种方式的添加数据表默认值列方法,一起观察一下变化情况。首先是允许为空默认值列的操作。


SQL> alter table t add vc varchar2(100) default 'TTTTTTTTTTTT';

表已更改。

已用时间: 00: 34: 37.15

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade=>true);

PL/SQL过程已成功完成。

已用时间: 00: 00: 03.86


SQL> select bytes/1024/1024,blocks from dba_segments where wner='SYS' and segment_name='T';

BYTES/1024/1024    BLOCKS
--------------- ----------
           208     26624

已用时间: 00: 00: 00.06
SQL> select blocks from dba_tables where wner='SYS' and table_name='T';

   BLOCKS
----------
    25864

已用时间: 00: 00: 00.01


果然是一个费时的操作,添加一个数据列默认值,总共消耗了近30分钟时间。原有数据表的体积也发生的膨胀,从原来的不到40M,上升到了208M。

这个现象告诉我们,当我们添加一个有default值的数据列,并且是直接添加的时候,一些数据被插入到了数据块中,引起空间膨胀。

在原有的结构下,数据添加到数据块上是必需的,只有这样才能将数据列default添加到里面去。

除了这个字句,我们是还可以提供数据列的not null选项,也是可以实现相同的功能的。


SQL> alter table t add vc2 varchar2(100) default 'TTTTTTTTTTTT' not null;

表已更改。

已用时间: 00: 15: 58.85

SQL> exec dbms_stats.gather

_table_stats(user,'T',cascade=>true);

PL/SQL过程已成功完成。

已用时间: 00: 00: 36.87

SQL> select bytes/1024/1024,blocks from dba_segments where wner='SYS' and segme
nt_name='T';

BYTES/1024/1024    BLOCKS
--------------- ----------
           256     32768

已用时间: 00: 00: 00.14
SQL> select blocks from dba_tables where wner='SYS' and table_name='T';

   BLOCKS
----------
    32448

已用时间: 00: 00: 00.04


也是消耗了15分钟,空间发生了很大程度变化。新空间分配,同时数据行数没有发生变化,潜在的行迁移(Row Migration)和行链接(Row Chaining)是严重恶化的!

综合分析Oracle 10g下的操作:为了添加上数据字段的默认值,Oracle会去访问每个数据块上的每个数据行进行数据列拓展工作,这个过程中还伴随着新空间分配和多余数据行复制。

这类型操作对于生产环境是恐怖的,在整个作业过程中,数据表结构被锁定,相关业务处理操作阻塞或者缓慢。所以,运维DBA都是选择在维护窗口或者变通的方法进行处理。

在Oracle 11g环境下,事情有了一些不同。
  • 大小: 27.8 KB
分享到:
评论

相关推荐

    Oracle基本数据类型存储格式浅析

    例如,如果定义一个CHAR(10)的列,即使只插入了三个字符'abc',数据库仍会将其扩展到10个字符,并在后面填充七个空格。这在DUMP函数的输出中可以清晰看到,DUMP(CHAR_COL, 16)返回的Len字段为10,表示总长度,其中...

    浅析Oracle数据库的性能优化.pdf

    本文将浅析Oracle数据库的性能优化,主要关注数据库服务器性能和数据库配置两个关键领域。 首先,数据库服务器性能是决定整体系统性能的核心。服务器的性能由操作系统和硬件配置共同决定。操作系统的选择和优化对于...

    浅析数据库管理系统中大批量数据处理的优化技术.pdf

    本文旨在浅析在数据库管理系统中,如何有效进行大批量数据处理的优化技术。 首先,SQL(结构化查询语言)作为数据库管理系统的基础,是处理和查询数据库数据的主要手段。SQL的基本命令可以实现数据的增删改查,从而...

    Oracle 中表数据的存储原理浅析

    ### Oracle中表数据的存储原理浅析 #### 1. 引言 在Oracle数据库中,当用户创建一个表时,Oracle会自动在相应的表空间内为此表分配数据段以容纳其数据。用户可以通过多种方式控制数据段的空间分配与使用: - 通过...

    Oracle数据库性能优化浅析

    ### Oracle数据库性能优化浅析 #### 一、引言 SQL作为数据库查询语言,其编写质量直接影响着数据库系统的整体性能。对于Oracle数据库而言,优化SQL查询不仅能够提高查询效率,还能减少系统资源消耗,进而提升整个...

    浅析Oracle数据库的性能优化 (2).pdf

    《浅析Oracle数据库的性能优化》一文,基于作者的长期监测和维护经验,提出了几个关键的优化策略,涵盖了从数据结构设计到数据库服务器性能优化、回滚段调整以及数据库碎片整理等多方面内容。 首先,调整数据结构...

    浅析Oracle存储过程触发器在数据同步中的应用.pdf

    - **安全性**:通过权限控制,可以限制对数据的直接访问,只允许通过存储过程进行操作,增强了数据库的安全性。 - **降低网络开销**:相比每次发送单独的SQL语句,发送存储过程调用可以减少网络传输的数据量。 2.2 ...

    浅析Oracle数据库的性能优化方案.pdf

    浅析Oracle数据库的性能优化方案.pdf

    浅析Oracle数据库的优化.pdf

    本文将探讨通过优化SQL语句在Oracle中的解析(Parse)、执行(Execute)和提取结果(Fetch)三个阶段来提升数据库性能的方法。 1. **解析(Parse)优化** 解析过程是SQL语句在Oracle中执行的第一步,包括计算语句...

    Oracle数据库性能优化浅析.pdf

    Oracle数据库是一种广泛应用于企业级环境的大型关系型数据库系统,其性能优化是数据库管理中至关重要的环节。随着数据量的不断增长和数据库访问量的增加,性能的下降是一个普遍问题,这直接影响了业务的效率和数据...

    浅析Oracle数据库的逻辑备份与恢复.pdf

    标题和描述中提到的是对Oracle数据库的逻辑备份与恢复进行浅析。Oracle数据库是业界广泛使用的关系型数据库管理系统,它支持逻辑备份和物理备份。逻辑备份主要通过Oracle提供的工具如EXP(Export)和IMP(Import)来...

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    在 Oracle 11g 及更高版本中,char 和 varchar2 的默认类型是 varchar2,但是在 Oracle 10g 及更低版本中,默认类型是 char。 Oracle 中 char 和 varchar2 的区别在于存储空间和查询速度,char 的存储空间是固定的...

    浅析ORACLE数据库中的DATAGUARD容灾备份技术.PDF

    浅析ORACLE数据库中的DATAGUARD容灾备份技术

    浅析Oracle的数据复制技术在容灾中的应用.pdf

    【Oracle 数据复制技术在容灾中的应用】 Oracle 数据复制技术是构建容灾系统的重要组成部分,其目的是确保在面临灾难性事件时,数据的安全性和业务连续性。本文将深入探讨Oracle的两种主要数据复制技术——Oracle ...

    Oracle中表数据的存储原理浅析.pdf

    本文主要探讨了Oracle中表数据的存储原理,包括数据块、数据段、行和片段的概念,以及PCTFREE和PCTUSED两个关键参数的使用。 在Oracle数据库中,当创建一个表时,系统会自动在相应的表空间内为这个表分配数据段以...

    浅析Oracle对SQL Server的比较优势.pdf

    Oracle的版本迭代从10gR2发展到11gR2,并在10g版本中首次提出了“网格计算”概念,这为应用技术效率的优化提供了理论基础,有助于实现技术的“质”的飞跃。而SQL Server的发展,则主要受限于Windows操作系统的更新。...

    浅析Oracle数据库性能优化的方法.pdf

    Oracle数据库性能优化是一个系统性的工程,涉及到数据库的多个核心组件,包括系统全局区域(SGA)、共享池、数据缓冲区高速缓存、重做日志缓冲区、PGA(程序全局区域)以及磁盘I/O等多个方面。下面将根据提供的文件...

    浅析利用Oracle物化视图对查询优化.pdf

    Oracle数据库作为当前最为广泛使用的关系型数据库之一,其性能优化是信息产业普遍关注的核心问题。尤其在大数据、云计算、物联网等概念兴起的背景下,如何利用Oracle物化视图进行查询优化,以应对上亿级别的数据量,...

    浅析Oracle数据库应用.pdf

    通过对这些方面的深入理解和有效管理,可以最大化Oracle数据库的潜力,使其在各种业务环境中发挥出最佳性能。对于企业和IT专业人员来说,掌握Oracle数据库的优化技术,对于提升系统的整体效率和用户体验具有重大意义...

Global site tag (gtag.js) - Google Analytics