oracle水位线

合集下载

ORACLE_分析函数大全

ORACLE_分析函数大全

ORACLE_分析函数大全Oracle分析函数是一种高级SQL函数,它可以在查询中实现一系列复杂的分析操作。

这些函数可以帮助我们在数据库中执行各种数据分析和报表生成任务。

本文将介绍Oracle数据库中的一些常用分析函数。

1.ROW_NUMBER函数:该函数为查询结果中的每一行分配一个唯一的数字。

可以用它对结果进行排序或分组。

例如,可以使用ROW_NUMBER函数在结果集中为每个员工计算唯一的编号。

2.RANK和DENSE_RANK函数:这两个函数用于计算结果集中每个行的排名。

RANK函数返回相同值的行具有相同的排名,并且下一个排名值将被跳过。

DENSE_RANK函数类似,但是下一个排名值不会被跳过。

G和LEAD函数:LAG函数返回结果集中指定列的前一个(上一个)行的值,而LEAD函数返回后一个(下一个)行的值。

这些函数通常用于计算增长率或发现趋势。

4.FIRST和LAST函数:这两个函数用于返回结果集中分组的第一个和最后一个行的值。

可以与GROUPBY子句一起使用。

5.CUME_DIST函数:该函数用于计算给定值的累积分布。

它返回值的累积分布在结果集中的位置(百分比)。

6.PERCENT_RANK函数:该函数用于计算结果集中每个行的百分位数排名。

它返回值的百分位数排名(0到1之间的小数)。

7. NTILE函数:该函数用于将结果集分成指定数量的桶(Bucket),并为每个行分配一个桶号。

通常用于将数据分组为更小的块。

8.LISTAGG函数:该函数将指定列的值连接成一个字符串,并使用指定的分隔符分隔每个值。

可以用它将多个值合并在一起形成一个字符串。

9.AVG、SUM、COUNT和MAX/MIN函数:这些是常见的聚合函数,可以在分析函数中使用。

它们用于计算结果集中的平均值、总和、计数和最大/最小值。

以上只是Oracle数据库中的一些常用分析函数。

还有其他一些分析函数,如PERCENTILE_CONT、PERCENTILE_DISC等可以用于更高级的分析计算。

如何看懂ORACLE执行计划

如何看懂ORACLE执行计划

如何看懂ORACLE执⾏计划如何看懂执⾏计划⼀、什么是执⾏计划An explain plan is a representation of the access path that is taken when a query is executed within Oracle.⼆、如何访问数据At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:Full Table Scan (FTS) --全表扫描Index Lookup (unique & non-unique) --索引扫描(唯⼀和⾮唯⼀)Rowid --物理⾏id三、执⾏计划层次关系When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --采⽤最右最上最先执⾏的原则看层次关系,在同⼀级如果某个动作没有⼦ID就最先执⾏1.⼀个简单的例⼦:SQL> select /*+parallel (e 4)*/ * from emp e;Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=7134)1 0 TABLE ACCESS* (FULL) OF 'EMP' (Cost=1 Card=82 Bytes=7134):Q5000--[:Q5000]表⽰是并⾏⽅式1 PARALLEL_TO_SERIAL SELECT /*+ NO_EXPAND ROWID(A1) */ A1."EMPNO",A1."ENAME",A1."JOB",A1."MGR",A1."HI优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采⽤CBO还是RBO:SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采⽤CBOSELECT STATEMENT [CHOOSE] --Cost为空,采⽤RBO(9I是如此显⽰的)2.层次的⽗⼦关系的例⼦:PARENT1**FIRST CHILD****FIRST GRANDCHILD**SECOND CHILDHere the same principles apply, the FIRST GRANDCHILD is the initial operation then the FIRST CHILD followed by the SECOND CHILD and finally the PARENT collates the output.四、例⼦解说Execution Plan----------------------------------------------------------0 **SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)1 0 **HASH JOIN (Cost=3 Card=8 Bytes=248)2 1 ****TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=36)3 1 ****TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=16 Bytes=304)左侧的两排数据,前⾯的是序列号ID,后⾯的是对应的PID(⽗ID)。

oracle数据库面试题目(3篇)

oracle数据库面试题目(3篇)

第1篇1. 请简述Oracle数据库的体系结构,并说明各层的作用。

2. 请解释什么是Oracle实例?实例与数据库之间的关系是什么?3. 请简述Oracle数据库的存储结构,包括数据文件、控制文件、日志文件等。

4. 请说明Oracle数据库的内存结构,包括SGA、PGA等。

5. 请解释Oracle数据库的备份策略,包括全备份、增量备份、差异备份等。

6. 请说明Oracle数据库的恢复策略,包括不完全恢复、完全恢复等。

7. 请解释Oracle数据库的事务管理,包括事务的ACID特性。

8. 请说明Oracle数据库的锁机制,包括共享锁、排他锁等。

9. 请解释Oracle数据库的并发控制,包括多版本并发控制(MVCC)。

10. 请说明Oracle数据库的安全机制,包括角色、权限、用户等。

二、SQL语言1. 请简述SQL语言的组成,包括数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)等。

2. 请说明如何创建一个简单的表,包括表结构、字段类型、约束等。

3. 请编写一个查询语句,查询某个表中所有年龄大于30岁的记录。

4. 请编写一个更新语句,将某个表中年龄大于40岁的记录的年龄加1。

5. 请编写一个删除语句,删除某个表中年龄小于20岁的记录。

6. 请编写一个插入语句,插入一条记录到某个表中。

7. 请说明如何使用SQL语句实现分页查询。

8. 请说明如何使用SQL语句实现多表查询。

9. 请说明如何使用SQL语句实现子查询。

10. 请说明如何使用SQL语句实现联合查询。

三、Oracle高级特性1. 请解释什么是视图?如何创建视图?2. 请解释什么是索引?有哪些常见的索引类型?3. 请解释什么是触发器?如何创建触发器?4. 请解释什么是存储过程?如何创建存储过程?5. 请解释什么是函数?如何创建函数?6. 请解释什么是包?如何创建包?7. 请解释什么是序列?如何创建序列?8. 请解释什么是同义词?如何创建同义词?9. 请解释什么是物化视图?如何创建物化视图?10. 请解释什么是分区表?如何创建分区表?四、Oracle性能优化1. 请说明如何查看Oracle数据库的性能统计信息。

oracle_move高水位原理_理论说明

oracle_move高水位原理_理论说明

oracle move高水位原理理论说明1. 引言1.1 概述本文将对Oracle数据库中的MOVE高水位原理进行深入探讨和分析。

在Oracle 数据库中,高水位是一个重要的概念,它代表了已经被使用过的数据块的最高位置。

MOVE操作是一种常用的数据库维护操作,在进行数据迁移、空间释放等操作时经常会使用到。

然而,MOVE操作对高水位有着直接而重要的影响,并且也会对数据库性能产生一定程度的影响。

1.2 文章结构本文共分为5个部分:引言、Oracle MOVE高水位原理、理论说明、实例演示与案例分析以及结论与展望。

在引言部分,我们将简要介绍文章所要讨论的主题,并概括出文章的结构和目标。

在后续各个章节中,我们将依次深入剖析了解Oracle数据库中MOVE操作与高水位之间的关系,并通过实例演示和案例分析来验证其效果。

1.3 目的本文旨在提供读者对Oracle MOVE高水位原理有全面且清晰的理解。

通过详细解释MOVE操作对高水位的影响以及数据块迁移原理等方面内容,帮助读者更好地掌握和应用这些知识。

此外,本文还将通过实例演示和案例分析,探讨MOVE操作的效果评估和优化策略,并对问题解决方案进行提供。

最后,在结论部分,我们将总结整篇文章的主要观点,并展望未来研究方向,以期为读者提供一个全面而深入的学习参考。

2. Oracle MOVE高水位原理:2.1 高水位概念解析:在Oracle数据库中,每个表都有一个高水位(High Water Mark)。

高水位是指在数据块中已被使用的最高位置,也可以理解为表的逻辑尾部。

所有数据的插入和更新操作都必须在高水位之下进行,否则将超越当前的高水位。

2.2 高水位产生与作用:当向表中插入新记录时,数据库会根据需要动态增加数据块以容纳新数据。

这些新的数据块直到达到当前高水位才能被利用。

因此,高水位的存在主要是为了管理和优化数据块的使用情况。

通过控制表的高水位,可以减少碎片化并提升存储空间的利用率。

水位线

水位线
就叫做低 HWM。一般来说,低HWM肯定是低于等于HWM的。
用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是
说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
下面我们来谈一下Orac进行一次扫描,但是究竟扫描多少数据存储块呢,
Oracle表段中的高水位线HWM
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,
在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个
时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采
描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这
个时候其实奥秘就是这里的高水位线了。
那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删
除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有
这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一
下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需
要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插

逻辑存储结构-段区块

逻辑存储结构-段区块

数据库逻辑存储结构数据库的物理存储结构对应一系列的物理文件,这部分主要描述的是数据存储的实际位置,不过数据如果存储,是以什么结构存储到数据文件中,则取决于数据库的逻辑存储结构.Oracle数据库在执行操作时,并不是以数据文件为单位,而是从逻辑上定义出一组结构,操作的数据可以一步步细分不同的存储单元,oracle 操作数据的过程,实际上就是对这些不同级别的存储单元进行维护和管理的过程.--数据库的存储结构分为:段(segment).区(extent)和数据块(block)段(segment):段是数据库内占用空间的对象.它们使用数据库中数据文件内的空间.一个tablespace对应多个segment,一个segment只能对应一个tablespace,但可以跨越对应tablespace下的datafiles--段类型:●表(table):是数据库中最重要的段,也是数据库内存储数据的最常用方法.表段用于存储非集簇且未分区的表中的数据.表段中的所有数据都必需存储在一个表空间内.●表分区(table partition):当一个表的规模很大,且并发操作非常频繁时,可以把这样表划分成若干个分区(partition).而每个分区驻留在不同的表空间.每个分区的存储参数都可以单独定义.可以通过把每个分区放在不同磁盘上以提高并行操作的能力,从而达到改进系统效率的目的.对于分区表,当一个分区损坏了并不影响其他分区的操作.提示:要使用分区表,必需使用oracle的企业版分区表的选项(partitioning),oracle提供了大批专门命令来管理和操作分区表.●簇(cluster):簇与表一样,是一种数据段类型.簇内的行是基于键列值存储的.一个簇可以包含一个或多个表.一个簇的表属于同一个段并且共享相同的存储特性.可以通过索引或者三列算法来访问集簇表内的行.提示:簇少用,这样可以减少管理和维护的负担,也可以使跨IT平台的移植变的更加容易.●索引(index):索引段的目的是加快基于某一特殊(索引关键字)的查询速度,这样查询可以很快查找到某一个表中所需数据的准确位置.一个特定索引的所有索引记录都记录在一个索引段中.如在吗果一个表有三个索引,那么就会有三个对应的索引段,SQL> conn erm/ermConnected.SQL> select * from tab;no rows selectedSQL> select segment_name,segment_type from user_segments; <==使用user_segments视图查看段类型(segment_type) no rows selectedSQL> create table t (id int primary key,name char(10)); <== 此表里有一个主键,建立主键自动创建索引.Table created.SQL> select segment_name,segment_type from user_segments;SEGMENT_NAME SEGMENT_TYPE------------------------------ ---------------SYS_C005144 INDEX <==t表主键的索引段T TABLE●索引分区(index partition):当在一个大型或超大型表上创建索引时,那这个索引也可能很大,所以也可以像分区表一样,将该索引划分为若干个分区,每个索引分区为一单独的段.这样一个索引可以分布在不同的表空间上.但每个索引分区(段)只能存放在一个表空间中.●索引表(index-organized table):如果用户的查询主要是基于索引关键字,那么在索引树的叶子节点中的数据行的地址部分可以存放真正的数据,这种存储结构称为索引表.索引表优点:可以大大的加快基于索引关键字的查询索引表缺点:索引表这种存储结构不适合DML(数据操纵语句)操作非常频分的表DML语言不隐含commit语句的,因此需要用户手动提交对数据库的修改.●临时段(temporary segment):当在SQL语句中使用了诸如ORDER BY,GROUP BY或DISTINCT等语句或关键字时,oracle就要试着在内存中进行排序,如果内存中排不下就把中间的结果写到磁盘上,该磁盘区就是临时段.●还原段(undo segment):还原段9i之前称为回滚段(rollback segment),用来存放事务(transaction)对数据库所做的改变.oracle涉及到一致性读操作.也就是当一个用户对一个表进行修改,而这时另一个用户对表做DML操作时,对任何数据块或索引块改变之前,所有的原始值都将存放到还原段中.这样做不但允许用户可以还原所做的变化,而且还可以在另一个用户对数据进行DML操作的同时,允许对该行数据进行读操作(读的是存放到还原段的原来的数据)●大对象段(LOB segment):大对象(LOB)数据类型是从8i开始引入的,用户存储例如大的正文文档,图像或音像信息的.在一个表中可以有一列或多列LOB数据类型.如果LOB类型的列很大.oracle就会将该列的值单独存放在另一个段中,该段就称为大对象段,在表中只包含一个指向相应大对象数据的指针(地址)●嵌套表(nested table):嵌套表是一种特殊表,该表中某一列又由一个用户定义的表组成,即表中套表,被称为嵌套表的内表呗存放在另外一个段中嵌套表少用●自举段(bootstrap segment):是在数据库被创建时由sql.bsq脚本创建,也被称作为高速缓存段.自举段DBA无法查询或修改,并且不需要dba维护.--存储子句优先级:●段级别定义了存储参数,将大于表空间定义的存储参数,但表空间一级的参数MINIMUM EXTENT或UNIFORM SIZ除外.●当段没有显示的定义存储参数,将默认为表空间一级做定义的参数●当表空间一级没有显示的定义存储参数,则使用oracle系统默认的存储参数注意事项:●如果指定了表空间的最小区(minimum extent)大小,则该大小适用于将来分配给该表空间内段的所有区.某些参数不能在表空间一级定义,而只能在段级别定义●如果对存储参数进行了修改,新的存储参数只适用于还没有分配的区--区的管理区是表空间内某个段使用的一块空间,它是由连续的oracle数据块组成.引入区的目的:为了提高系统的效率,利用区来进行磁盘空间分配可以大大的减少磁盘分配的次数.oralce的磁盘分配算法是一个递归算法.而递归算法效率本身就比较低,减少磁盘分配的次数,也就等于减少了该递归发`算法使用的次数.当段处于以下情况时分配区●当一个段被创建时(created)时●当一个段被扩展(extended)时●当一个段被改变时(altered)时当段处于以下情况时回收区●当一个段被删除(dropped)时●当一个段被改变时●当一个段被截断(truncated)时<==删除表数据,并且释放数据块空间创建表空间时,在该表空间中的数据文件就包含了一个文件头,这个头就是该数据文件的第一个或前几个数据块.段所使用的的连续磁盘空间被称作使用区(used extent)未使用的称作空闲区(free extent),当一些段释放了磁盘空间时,这些释放的区段就被添加到所在表空间中可以使用的空闲区中.--数据库块:oracle最小的存储单位就是数据库块,也称作oracle数据库块.oracle数据块是由一个或多个操作系统块组成,其大小在表空间创建时,设置DB_BLOCK_SZIE为默认oracle数据块的大小.可以使用命令在操作系统级别查看数据库参数文件里默认的db_block_size值或是从数据库里使用dba_tablespaces视图来查看当前数据块大小[oracle@fs11 ~]$ strings $ORACLE_HOME/dbs/spfilemfs.ora |grep -i db_block <==grep –i -i参数表示不区分大小写*.db_block_size=8192 或SQL> show parameter db_block_size <==在数据库里查看参数NAME TYPE VALUE------------------------------------ ----------- ------------------------------ 或db_block_size integer 8192SQL> select TABLESPACE_NAME,BLOCK_SIZE from dba_tablespaces; 在数据库里使用dba_tablespaces视图--数据块大小在8i前的版本中,oracle只能有一种数据块,其大小由DB_BLOCK_SIZE设定,9i版本开始,支持多种数据块大小,9i开始oracle数据库可使用一个标准数据块和4个非标准数据块.--标准数据块标准数据块的大小被用于系统表空间和临时表空间.数据库中标准数据块的大小是在数据库创建时,由初始化参数DB_BLOCK_SIZE设置,如果要修改标准块大小,只能重建数据库提示:除非有特别的说明,一般将最常用的数据块大小选为标准数据块大小,而且标准块大小还用作表空间默认块大小.如果没有说明,默认数据块的大小是是与操作系统相关的,在一般情况下这个默认值最合适.非标准数据块的大小为2的次方,其值在2-32kb之间,即2,4,8,16,32提示:虽然非标准块为2,4,8,16,32 共五种,但一般32位的windows或linux操作系统上oracle数据块使用的是8,所以在32位系统中,非标准DB_CACHE_SIZE参数用来执行标准块大小缓冲区的高速缓冲区大小,它的最小值为一个granule(颗粒)(4MB or 16MB) 默认值为48MB.该高速缓存的数据块大小为标准块大小,由DB_BLOCK_SIZE所定义.8i之前版本中的DB_BLOCK_BUFFERS初始化参数已被DB_CHCHE_SIZE初始化参数所取代.提示:granule是一个连续虚拟内存分配单位,granule的大小取决于估算的SGA的总大小,这个总大小是根据SGA_MAX_SIZE的参数值计算的,如果估算的SGA的大小<128MB,则为4MB;否则为16MB.--非标准块大小使用以下动态参数配置附加高速缓存◆DB_2K_CACHE_SIZE 用于 2 KB blocks◆DB_4K_CACHE_SIZE 用于 4 KB blocks◆DB_8K_CACHE_SIZE 用于 8 KB blocks◆DB_16K_CACHE_SIZE 用于 16 KB blocks◆DB_32K_CACHE_SIZE 用于 32 KB blocks提示:数据块大小还受到IT平台的一些限制,如果使用的IT平台上最小块为2KB,那么就不能设置DB_2K_CACHE_SIZE;以此类推,IT平台设置了2,4,8,16,32,其中任意一个,那DB_nK_CACHE_SIZE就不能设置相同的值. DB_nK_CACHE_SIZ默认值为0--多种数据块大小的规则●一个分区对象的所有分区(partition)必需存在相同块大小的表空间中●所有临时表空间,包括被用作默认临时表空间的的永久表空间都必需是标准块大小●索引表的overflow(溢出)和外部LOB段可以存储在块大小与基表不同的表空间中.--创建非标准块大小的表空间通过在CRTATE TABLESPACE语句中使用BLOCKSIZE nK或BLOCKSIZE n子句来创建非标准块大小的表空间,n为整数,单位为字节,如果使用后缀为K,单位为KB.为了使用这一语句,必须首先设置DB_CACHE_SIZE和至少一个DB_nK_CACHE_SIZE参数,而且该子句中的正整数也必须与所对应的DB_nK_CACHE_SIZE参数中的正整数n相同.如果没有设置或不匹配会在创建非标准块表空间时报错SQL> show parameter db_block_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192SQL> show parameter db_16NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0SQL> create tablespace tbs2 datafile3 '/u01/app/oracle/oradata/mfs/tbs_01.dbf'4 size 10m blocksize 16k;create tablespace tbs*ERROR at line 1: 第 1 行出现错误:ORA-29339: tablespace block size 16384 does not match configured block sizesORA-29339: 表空间块大小 16384 与配置的块大小不匹配提示:能不创建非标准块就不创建,因为使用非标准块大小的表空间会增加内存的开销.--创建非标准块步骤:SQL> show parameter db_block_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192SQL> show parameter db_16 <==查看db_nk_cache_size其中一个值NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0SQL> alter system set db_16k_cache_size=4M; <==设置SQL> create tablespace tbs datafile '/u01/app/oracle/oradata/mfs/tbs_01.dbf' size 10m blocksize 16k;SQL> select tablespace_name,block_size,contents from dba_tablespaces;TABLESPACE_NAME BLOCK_SIZE CONTENTS------------------------------ ---------- ---------SYSTEM 8192 PERMANENTUNDOTBS1 8192 UNDO……USERS 8192 PERMANENTTBS 16384 PERMANENT <==创建的非标准块表空间的块大小--数据块结构●数据块头:包含块的一些属性信息,如块的物理位置,块所属的段的类型(如数据段,索引段,回滚段等)和事务槽.事务槽是在事务修改数据块中的数据行时使用的,头部从上往下增长●表目录:块中存储的数据为表数据,表目录中保存关于这个表的相关信息●行目录:块中存储的数据为表数据,表目录中保存数据行的相关信息提示:一个块中可能包含多条表记录,也可能只保存某条记录的一部分,这要视记录的长度及该块的空间分配情况而定.数据块头,表目录和行目录组成了块的头部信息,这部分并不存储数据库中的实际数据,而是用来记录该块的逻辑结构,而且这部分占用的空间并不是固定的,平均大概占用84-107个字节的空间.是从上往下增加●行记录(数据空间/已用空间):数据块中已被写入数据的区域,当数据被删除时,这部分空间会被转换成空闲空间.提示:行记录/行数据是从下往上插入到块中●空闲空间:当前块的可用空间,是块中尚未使用的存储空间.当对现有数据进行update或insert新数据到块中时,就是从这部分空间分配容量用来写入数据.如果执行update操作时,块中的空间已经不足以存储修改的数据,那么记录就将被保存到另外一个拥有足够空间的块中,而只在原块保留一条指向新块的rowid,这种现象就是行迁移(row migration)提示:数据块存储的数据不影响块的内部机构.不管块中存储的是什么数据类型,块的内部结构都是相同的.提示:最初,块内的空闲空间是连续的,但是,删除和更新会使块内的空闲空间产生碎片.oracle服务器可以在需要时合并块内的空闲空间.--数据块的空间管理●手动管理●自动管理(ASSM automatic segment space management)为了更有效的管理和控制oracle数据块的各个部分,oracle引入了4个参数这个四个参数可以用来控制数据块段的空间使用,也可以控制索引段中的空间.它们又被分为控制并行操作的参数和控制数据空间使用的参数两类控制并行操作的参数:INITRANS和MAXTRANS在了解这两个参数前,先了解下数据块中与事务有关的数据行和块头的结构在数据块中每一数据行的头部有一个锁位,该锁位只记录了该行在事务中所使用的事务槽号,而事务槽是在数据块头中,有关事务的控制信息都放在了事务槽中.oracle是通过每一行的锁位中事务槽号在数据块头中找到所对应的事务槽,并利用该槽中的信息来完成该数据行的事务控制.事务槽是用来存储与当前改变数据块的事务有关的信息.每一个事务只使用一个事务槽,即使这个事务正在修改行数据或多行索引记录.●INITRANS;定了创建数据块或索引块时事务槽的初始值.此参数用来保证最低水平的并行操作.对数据段默认值为1,对索引段默认值为2.如果该参数被设置被设置为8,那么oracle服务器就能在任何时候都保证在一个数据块中可以有最多8个并行的事务.●MAXTRANS;定义了创建数据块或索引块时事务槽的最大值.如果并行的事务很多,所需要的事务槽个数可能超过INITRANS所设定的初始值,oracle会在块头中分配更多的事务槽,其数量的上线就是MAXTRANS所定的值,默认值为255提示:并行操作与数据块哦你关键利用率是相互矛盾的,如果将INITRANS和MAXTRANS设置的过大,这样不仅并行操作改进了,而且系统的效率也有所提高,但是由于数据块头的加大而使在数据块中所存储的数据减小.意见:没必要就不要改变它们的默认值控制数据空间使用的参数:PCTFREE和PCTUSED,这两个参数来管理数据块--手工数据块的管理Oracle允许通过使用如下参数来手工配置数据块以便更有效的管理和控制数据块中的磁盘空间的使用(在这里的数据块既可以包括数据段的块,也包括索引段中的块)●PCTFREE:该参数定义在每个数据块中预留空间的百分比.这部分空间只是在数据块中的数据行进行修改操作(update)而造成的增长时使用.默认值为10%●PCTUSED:该参数用来定义每个数据块中已经使用的空间百分比.只有当一个数据块中所使用的空间低于这一参数所设定值时,oracle才将这一数据块放入空闲队列.默认值40%●FREELISTS:该参数用来在一个段中定义空闲队列(free list)的个数.空闲队列是一个数据块的列表,这些数据块将被用作插入操作的候选数据块.在默认情况下,创建一个段时只有一个空闲队列.根据需要可以通过设置FREELISTS参数在一个段中创建多个空闲队列使用这些参数目的是为了提高系统的效率参数使用说明当PCTFREE小于或等于20%时不能插入,而当PCTUSED=40%时可以插入数据--行迁移与行连接行迁移(row migration):举例说明,某个数据块中已经存放如了n行记录,其中某条记录需要进行更新操作,被更新的值较多,在写入到数据块时,发现该数据块中的空闲空间已经不足以存储更新后的行记录,在这种情况下oracle不得不把这行记录从原数据块中移出来,存储到另外一个具有足够空间的数据块中.不过oracle并不是简单的将记录移走,因为有些对象如索引仍然保存着该条记录对应的位置,而从块中移动记录并不会触发索引的自动维护,为了确保该记录的实际存储位置发生迁移后,通过索引还能找到该条记录,oracle在移走该记录的是同时,还会在原块保留地址的一个指向.也就是留一个指针.行迁移造成的影响.当通过索引访问那条记录时,原来根据索引中记录的rowid即可通过一次I/O找到目标,不过现在只能找到目标数据的一个地址指针,因此不得不通过再一次I/O找到记录所在的新的位置,相当于查询时I/O负载提高了1倍行迁移的记录在数据库中比较高,那么系统的性能就会被明显拖累,因此降低数据库中的行迁移现象,是数据库调优的一项重要操作,通过适当设置块的PCTFREE参数值,可以在一定程度上降低产生迁移的机率,但并不可能完全杜绝.行连接(row chaining):当表中记录的长度超出了块大小时,就必然会产生行连接的情况.如当前块大小设置为8KB,如果某个表包含2个VARCHAR2(4000)的列并写满数据,对于这种记录,一个块无论如何也是放不下的,记录必然会被存储到多个块中.这种情况下,oracle就要在块中标记出该行记录连接的另一个块的位置.对于表中的列较多,或者含有大类型字段都极有可能出现这种情况,可以视为正常存储现象--自动管理块大小/自动管理段空间自动的段空间管理是一种在数据库段内部管理空闲空间的方法.该方法使用位图而不是使用空闲队列来追踪段内的空闲和使用空间.特点:●管理上的便利,因为PCTUSED,PCTFREE和FREELISTS等参数都是自动管理的●较好的空间利用,这种方法中所有对象,特别是行的尺寸变化很大的对象的空间利用率会更有效●并行插入(insert)操作性能有较大改进,改进了对并发访问变化的运行时调整限制:不能用于包含LOB的表空间1.自动的段空间管理,是使用位图(一个字节有8位,每个位两种状态0和1)来管理磁盘空间2.在一个自动管理的表空间中所有的位图管理段包含了一个位图,3.该位图描述了段中每一块与可获得可用空间相关的状态.4.这个位图存放在一组单独的数据块中,这组数据块被称为位图块(BMBs)5.插入新的一行时,服务器检索位图以找到一个具有足够空间的块6.当块中的可用空间数量发生变化时,位图中就会反映出它的新状态.--创建自动管理段空间*注意*自动的段空间管理,只能在表空间一级,而且是本地管理的表空间才能开启自动的段空间管理.在创建表空间时,在创建本地管理表空间命令中加入SEGMENT SPACE MANAGEMENTAUTO子句就可以完成自动段空间爱你管理配置SQL> create tablespace tbs2 datafile '/u01/app/oracle/oradata/mfs/tbs2_01.dbf' size 10M2 extent management local uniform size 1m segment space management auto;SQL> select tablespace_name,block_size,extent_management,segment_space_management2 from dba_tablespaces where lower(TABLESPACE_NAME)='tbs2';TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN------------------------------ ---------- ---------- ------TBS2 8192 LOCAL AUTOSQL> select tablespace_name,block_size,extent_management,segment_space_management from dba_tablespaces;TABLESPACE_NAME BLOCK_SIZE EXTENT_MAN SEGMEN------------------------------ ---------- ---------- ------SYSTEM 8192 LOCAL MANUALUNDOTBS1 8192 LOCAL MANUAL……TBS 16384 LOCAL AUTOTBS2 8192 LOCAL AUTO因为数据字典dba_tablespaces的segment_space_management一列值为AUTO说明此表空间是一个自动管理的表空间--高水位线(High-warter mark, HWM)在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。

Oracle性能优化之oracle中常见的执行计划及其简单解释

Oracle性能优化之oracle中常见的执行计划及其简单解释

Oracle性能优化之oracle中常见的执⾏计划及其简单解释⼀、访问表执⾏计划1、table access full:全表扫描。

它会访问表中的每⼀条记录(读取⾼⽔位线以内的每⼀个数据块)。

2、table access by user rowid:输⼊源rowid来⾃于⽤户指定。

3、table access by index rowid:输⼊源rowid来⾃于索引。

4、table access by global index rowid:全局索引获取rowid,然后再回表。

5、table access by local index rowid:分区索引获取rowid,然后再回表。

6、table access cluster:通过索引簇的键来访问索表。

7、external table access:访问外部表。

8、result cache:结果集可能来⾃于缓存。

9、mat_view rewrite access:物化视图。

⼆、与B-TREE索引相关的执⾏计划1、index unique scan:只返回⼀条rowid的索引扫描,或者unique索引的等值扫描。

2、index range scan:返回多条rowid的索引扫描。

3、index full scan:顺序扫描整个索引。

4、index fast full scan:多块读⽅式扫描整个索引。

5、index skip scan:多应⽤于组合索引中,引导键值为空的情况下索引扫描。

6、and-equal:合并来⾃于⼀个或多个索引的结果集。

7、domain index:应⽤域索引。

三、与BIT-MAP索引相关的执⾏计划1、bitmap conversion:将位转换为rowid或相反。

2、bitmap index:从位图中取⼀个值或⼀个范围。

3、bitmap merge4、bitmap minus:5、bitmap or:四、与表连接相关的执⾏计划1、merge join:排序合并连接。

oracle中truncate和delete的区别比较

oracle中truncate和delete的区别比较

truncate和delete的区别比较文档作者: 叶玉虎创建日期: 2016-10-22更新日期: 2016-10-22Version: 1.文档控制更改记录审阅分发人员参考文献一.o racle中truncate和delete的区别比较在oracle数据库中,使用truncate和使用delete都可以实现删除一个表中的数据操作,但是它们却存在着很大的不同。

truncate的作用是清空一个表格,在删除数据方面,truncate与delete存在如下一些方面的不同:(1)在数据处理功能上,truncate是清空一个表的所有内容,它相当于delete fromtable_name。

(2)delete是DML操作,而truncate是DDL操作。

因此,用delete删除整个表中的数据时,会产生大量的rollback,占用很多的rollback segments,而truncate则不会,也就是说如果你使用truncate清空了一张表,那么想后悔都不行了。

(3)在内存中,用delete删除数据,表空间中被删除数据的表占用的空间还在,便于以后使用,另外它还是“假象”的删除,相当于在Windows中按下【DELETE】键删除数据把数据放到回收站中,还可以恢复。

当然,如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了。

(4)在内存中,用truncate清除数据,表空间中被删除数据的表占用的空间会被立即释放,相当于在Windows中按下【Shift+Delete】组合键删除数据,不能够恢复。

(5)truncate调整高水位线(High Water Mark,HWM),而delete不调整;使用truncate之后,table的HWM退回到INITIAL和Next的位置(默认位置),delete则不可以。

HWM一般是相对于一个表而言的,当一个表有数据不断插入时,HWM的值不断提高,对那些全表扫描的select查询是以HWM为终点的,即使表中可能只有一行记录。

oracle监控指标

oracle监控指标

Oracle监控指标1. 简介Oracle是一种关系型数据库管理系统,被广泛应用于企业级应用程序中。

在使用Oracle数据库时,监控数据库的性能和运行状态是非常重要的。

通过监控指标,可以及时发现并解决潜在的问题,确保数据库的稳定性和可靠性。

本文将介绍Oracle数据库中常见的监控指标,包括性能指标、存储指标、会话指标、等待事件指标等。

通过对这些指标的监控和分析,可以全面了解数据库的运行状况,并采取相应的措施进行优化和调整。

2. 性能指标性能是数据库系统最重要的衡量标准之一。

下面是一些常见的Oracle性能指标:CPU利用率CPU利用率是衡量数据库服务器CPU资源使用情况的重要指标。

可以通过查询V$SYSSTAT视图中与CPU相关的统计信息来获取CPU利用率信息。

内存利用率内存利用率反映了数据库服务器内存资源使用情况。

可以通过查询V$SGASTAT视图中与内存相关的统计信息来获取内存利用率信息。

IO吞吐量IO吞吐量是衡量磁盘I/O操作效率的重要指标。

可以通过查询V$SYSSTAT视图中与I/O相关的统计信息来获取IO吞吐量信息。

响应时间响应时间是衡量数据库系统性能的关键指标之一。

可以通过查询V$SYS_TIME_MODEL视图中的统计信息来获取响应时间信息。

3. 存储指标存储是数据库系统中最重要的资源之一,对存储进行有效管理和监控是确保数据库性能稳定的关键。

下面是一些常见的Oracle存储指标:表空间使用率表空间使用率是衡量数据库存储资源利用情况的重要指标。

可以通过查询DBA_TABLESPACE_USAGE_METRICS视图来获取表空间使用率信息。

数据文件使用率数据文件使用率反映了数据库中数据文件的利用情况。

可以通过查询DBA_DATA_FILES视图来获取数据文件使用率信息。

日志文件使用率日志文件使用率是衡量数据库日志文件利用情况的重要指标。

可以通过查询V$LOG视图来获取日志文件使用率信息。

oracle高水位详解

oracle高水位详解

1 row selected.
2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;
Statement processed.
3) SQL> SELECT table_name,num_rows,blocks,empty_blocks
Used
----------
0 ----这表名没有任何数据库块容纳数据,即表中无数据
1 row selected.
10) SQL> TRUNCATE TABLE big_emp1;
Statement processed.
WHERE table_name='BIG_EMP1';
TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS
--------- -------- ------- ----------
BIG_EMP1 0 700 323
4) SQL> SELECT COUNT (DISTINCT
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"
FROM big_emp1;
五、修正ORACLE表的高水位线
在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。
下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。

oracle降低高水位线教程

oracle降低高水位线教程

Oracle降低高水位线方法编制人:众所周知oracle数据库在使用到一段时间之后会有表空间文件变大并且占用磁盘空间较多的情况,这种情况叫做高水位线现象。

这时候一般都是数据库空间中的某些表数据量过大造成的,因为频繁的对某一个表进行大量的DML语句操作所以占用的空间会上升的很快。

如果一个表的数据量一直处于较大的情况会导致数据库在进行DML语句操作时运行缓慢,严重时会导致性能几句降低、死机等现象。

使用OB等工具查看现有数据库使用情况如下:当占用空间很大时,我们会第一时间想到删除数据库中无用的数据来降低磁盘占用率。

我们在使用delete语句在进行删除的时候会提示删除了XXXX条信息。

如,删除60天前的数据delete from z_testresult where starttime<=(sysdate-60);commit;--或者用这句delete FROM z_testresult where to_char(starttime,'yyyy-mm-dd')<to _char(sysdate-60,'yyyy-mm-dd');在删除了以上无用的数据之后我们通过OB等工具对数据库表空间的容量进行查得知,并没有减少。

从上图可以看出我们使用delete删除了数据之后数据库的空间占用率并没有下降,但是我们明明已经将数据删除并且提交了。

这实际上是与oracle的机制有关系。

在oracle的世界中数据文件占用的空间分为两类,一类是物理磁盘空间,一类是数据文件的逻辑空间。

物理空间我们可以正常理解就是我们正常可以从磁盘使用率中看到的磁盘使用大小;逻辑空间是当数据库文件使用了一定量的物理空间之后,数据具体在这个物理空间上占用了多少的块。

如果不好理解的话给大家举个例子,大家都使用过迅雷,迅雷在下载文件的时候采用了一种手段就是先占用一定的磁盘空间,但是不像这个空间写入数据只是先占用上,类似于画了个框不让其他数据进来,等下来到数据之后才开始向这个空间写入需要的东西。

如何处理ORACLE高水位的问题

如何处理ORACLE高水位的问题

什么是水线(High Water Mark)?----------------------------所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。

这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。

HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。

但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。

HWM数据库的操作有如下影响:a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。

如何知道一个表的HWM?a) 首先对表进行分析:ANALYZE TABLE <tablename> ESTIMATE/COMPUTE STATISTICS;b) SELECT blocks, empty_blocks, num_rowsFROM user_tablesWHERE table_name = <tablename>;BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。

EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块。

让我们以一个有28672行的BIG_EMP1表为例进行说明:1) SQL> SELECT segment_name,segment_type,blocksFROM dba_segmentsWHERE segment_name='BIG_EMP1';SEGMENT_NAME SEGMENT_TYPE BLOCKS EXTENTS----------------------------- ----------------- ---------- ------- BIG_EMP1 TABLE 1024 21 row selected.2) SQL> ANALYZE TABLE big_emp1 ESTIMATE STATISTICS;Statement processed.3) SQL> SELECT table_name,num_rows,blocks,empty_blocksFROM user_tablesWHERE table_name='BIG_EMP1';TABLE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS------------------------------ ---------- ---------- ------------BIG_EMP1 28672 700 3231 row selected.注意:BLOCKS + EMPTY_BLOCKS (700+323=1023)比DBA_SEGMENTS.BLOCKS少个数据库块,这是因为有一个数据库块被保留用作segment header。

oracle数据库高水位线问题处理

oracle数据库高水位线问题处理

oracle数据库⾼⽔位线问题处理⼀、什么是⾼⽔线(High Water Mark)?Oracle 数据库在创建⼀张表时,会为这张表分配⼀个段空间(segment),为了⽅便理解,把段空间容纳数据的上限,称之为⾼⽔位线(HIGH WATER MARK) HWM ,HWM是⼀个标记,⽤来说明表⽰有多少未使⽤的块分配给这个段。

两个结论:1.⽔位线以上表⽰已经分配但还未使⽤块(block),⽔位先以下爱表⽰已经分配且已经使⽤过的块(包含了正在使⽤的块和使⽤过的且被删除了数据的空块)2.理论上来说,⼀张表的⽔位线只会增⼤不会减⼩(除⾮通过特殊的⽅法重置),即使将表中的数据全部删除,HWM还是为原值。

⼆、HWM数据库的操作有如下影响:a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。

b) 即使HWM以下有空闲的数据库块,键⼊在插⼊数据时使⽤了append关键字,HWM也会不断增⼤,占⽤系统资源,表所占的实际空间会不断增⼤,导致系统出现问题三、⾼⽔位线原因以及解决⽅法:产⽣原因:1.操作表时使⽤删除了⼤量数据。

2.在插⼊时使⽤了/append nologging/语句,append关键字会从为表分配段中的随机位置插⼊,⽔位线会不断增⾼。

3.Sql load 时默认使⽤truncate ⾃带了reuse storage参数,导致truncate以后⽔位线不会降低。

解决⽅法:1.直接truncate table drop storage2.建⽴⼀张维护表定期move并重建索引或者shrink space。

3.表数据落表时按照⽇期建⽴了备份表,保留⼀定天数数据4.Rename表名,重建表,重建索引,将数据导⼊重建表,drop原表,然后rename重建表为原表5.使⽤alter table 表名 shrink space(oracle10新增功能)6.在线表重定义(功能强⼤,操作复杂,⼀般不使⽤,可以改变表的结构)表重建的两个⽅法move与shrink的对⽐:move是oracle8出现的命令,使⽤时会创建⼀块和原来表空间相同⼤⼩的另⼀块表空间,然后进⾏数据的复制,完成后使⽤后表替换原表,解决hwm的问题。

oracle 水位线概念

oracle 水位线概念

oracle 水位线概念
Oracle 水位线(Oracle High Water Mark)指的是数据库的事务日志(Redo Log)中最后一个成功写入磁盘的位置,也就是当前数据库中的数据记录最后被修改的位置。

在数据库发生崩溃或需要恢复的情况下,Oracle 恢复管理器会使用水位线作为恢复的起点,从而保证数据的完整性。

水位线是动态变化的,随着数据库中数据的插入、更新和删除操作不断进行,水位线也会不断移动。

因此,通过水位线可以判断数据库中的数据是否被修改过,也可以用于数据库备份和恢复等操作。

ORACLE高水位(HWM)是什么意思

ORACLE高水位(HWM)是什么意思

ORACLE⾼⽔位(HWM)是什么意思在Oracle数据的存储中,可以把存储空间想象为⼀个⽔库,数据想象为⽔库中的⽔。

⽔库中的⽔的位置有⼀条线叫做⽔位线,在Oracle中,这条线被称为⾼⽔位线(High-warter mark, HWM)。

在数据库表刚建⽴的时候,由于没有任何数据,所以这个时候⽔位线是空的,也就是说HWM为最低值。

当插⼊了数据以后,⾼⽔位线就会上涨,但是这⾥也有⼀个特性,就是如果你采⽤delete语句删除数据的话,数据虽然被删除了,但是⾼⽔位线却没有降低,还是你刚才删除数据以前那么⾼的⽔位。

也就是说,这条⾼⽔位线在⽇常的增删操作中只会上涨,不会下跌。

也就是说,⾼⽔位线不会因为 DELETE 操作⽽降低。

⾼⽔位并不会下降,随之导致的是全表扫描的实际开销并没有任何减少。

delete数据是没⽤的,即使数据删除了,⾼⽔位的值也不会下降。

释放表的⾼⽔位通常有如下⼏种办法:(1)对表进⾏MOVE操作:ALTER TABLE TABLE_NAME MOVE;。

若表上存在索引,则记得重建索引。

(2)对表进⾏SHRINK SPACE操作:ALTER TABLE TABLE_NAME SHRINK SPACE;,注意,在执⾏该指令之前必须开启⾏移动:ALTER TABLE TABLE_NAME ENABLE ROW MOVEMENT;。

该⽅法的优点是:在碎⽚整理结束后,表上相关的索引仍然有效,缺点是会产⽣⼤量的UNDO和REDO。

(3)复制要保留的数据到临时表T,DROP原表,然后RENAME临时表T为原表。

(4)exp/imp或expdp/impdp重构表。

(5)若表中没有数据则直接使⽤TRUNCATE来释放⾼⽔位。

oracle降低高水位线教程

oracle降低高水位线教程

Oracle降低高水位线方法编制人:众所周知oracle数据库在使用到一段时间之后会有表空间文件变大并且占用磁盘空间较多的情况,这种情况叫做高水位线现象。

这时候一般都是数据库空间中的某些表数据量过大造成的,因为频繁的对某一个表进行大量的DML语句操作所以占用的空间会上升的很快。

如果一个表的数据量一直处于较大的情况会导致数据库在进行DML语句操作时运行缓慢,严重时会导致性能几句降低、死机等现象。

使用OB等工具查看现有数据库使用情况如下:当占用空间很大时,我们会第一时间想到删除数据库中无用的数据来降低磁盘占用率。

我们在使用delete语句在进行删除的时候会提示删除了XXXX条信息。

如,删除60天前的数据delete from z_testresult where starttime<=(sysdate-60);commit;--或者用这句delete FROM z_testresult where to_char(starttime,'yyyy-mm-dd')<to _char(sysdate-60,'yyyy-mm-dd');在删除了以上无用的数据之后我们通过OB等工具对数据库表空间的容量进行查得知,并没有减少。

从上图可以看出我们使用delete删除了数据之后数据库的空间占用率并没有下降,但是我们明明已经将数据删除并且提交了。

这实际上是与oracle的机制有关系。

在oracle的世界中数据文件占用的空间分为两类,一类是物理磁盘空间,一类是数据文件的逻辑空间。

物理空间我们可以正常理解就是我们正常可以从磁盘使用率中看到的磁盘使用大小;逻辑空间是当数据库文件使用了一定量的物理空间之后,数据具体在这个物理空间上占用了多少的块。

如果不好理解的话给大家举个例子,大家都使用过迅雷,迅雷在下载文件的时候采用了一种手段就是先占用一定的磁盘空间,但是不像这个空间写入数据只是先占用上,类似于画了个框不让其他数据进来,等下来到数据之后才开始向这个空间写入需要的东西。

【Oracle】append

【Oracle】append

【Oracle】append我们在⽣产环境中经常遇到需要往表中插⼊⼤量数据的情况,怎么样才能让插⼊数据的速度变快呢?Oracle中的append简直就是神器!!没图说个**,直接上图:是不是看晕了?哈哈,莫慌,请看下⾯总结:1. 数据库为归档模式,必须同时有nologging和append才可以;2. 数据库为⾮归档模式,只需要append就可以了。

为什么使⽤了append就能提⾼速度呢?这是因为append可以使数据库在⾼⽔位线之上直接插⼊数据,相对于普通插⼊,在做rollback的时候需要更少的操作(加了append后的insert,在做rollback时直接把⾼⽔位线降到原来位置),所以就可以产⽣更少的redo。

PS:提供⼀下实验可能会⽤的SQL1. 查询数据库状态(1)SELECT name,log_mode FROM v$database;(2)ARCHIVE LOG LIST;2. 修改数据库归档状态步骤1:shutdowm immediate步骤2:startup mount步骤3:alter database archivelog; 或者 alter database noarchivelog;步骤4:alter database open;3. 查询redo和undo量select name,value from (select ,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where name='redo size' or name like 'undo change%';The End!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

&lt;注意&gt;:MOVE后索引要重建
--------------------------
TRUNCATE TABLE
SQL&gt; create table t007 as select * from t003;
表已创建。
SQL&gt; truncate table t003;
Unused Bytes............................581632
Last Used Ext FileId....................1
Last Used Ext BlockId...................35593
Last Used Block.........................57
表已创建。
SQL&gt; exec show_space(&#39;T001&#39;);
PL/SQL 过程已成功完成。
SQL&gt; SET SERVEROUTPUT ON
SQL&gt; exec show_space(&#39;T001&#39;);
Free Blocks.............................0
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,&#39;.&#39;) ||
PL/SQL 过程已成功完成。
SQL&gt; INSERT INTO T001 NOLOGGING SELECT * FROM T001;
已创建1220行。
SQL&gt; /
已创建2440行。
SQL&gt; /
已创建4880行。
SQL&gt; /
已创建9760行。
SQL&gt; /
LAST_USED_EXTENT_BLOCK_ID =&gt; l_LastUsedExtBlockId,
LAST_USED_BLOCK =&gt; l_LAST_USED_BLOCK );
p( &#39;Free Blocks&#39;, l_free_blks );
p( &#39;Total Blocks&#39;, l_total_blocks );
free_blks =&gt; l_free_blks );
dbms_space.unused_space
( segment_owner =&gt; p_owner,
segment_name =&gt; p_segname,
segment_type =&gt; p_type,
total_blocks =&gt; l_total_blocks,
已创建19520行。
SQL&gt; COMMIT;
提交完成。
SQL&gt; exec show_space(&#39;T003&#39;);
Free Blocks.............................895
Total Blocks............................1152
p_partition in varchar2 default null)
as
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
修正ORACLE表的高水位线HWM2010-02-11 01:47
HWM
=====================
1.基本概念
HWM(High Water Mark):高水位线
是数据库段管理中的一个重要概念
Last Used Ext FileId....................1
Last Used Ext BlockId...................33545
Last Used Block.........................57
PL/SQL 过程已成功完成。
占用可字节数以及块数降低下来
Free Blocks.............................895
Total Blocks............................1152
Total Bytes.............................9437184
Unused Blocks...........................71
Unused Blocks...........................7
Unused Bytes............................57344
Last Used Ext FileId....................1
Last Used Ext BlockId...................33217
total_bytes =&gt; l_total_bytes,
unused_blocks =&gt; l_unused_blocks,
unused_bytes =&gt; l_unused_bytes,
LAST_USED_EXTENT_FILE_ID =&gt; l_LastUsedExtFileId,
p( &#39;Last Used Ext BlockId&#39;, l_LastUsedExtBlockId );
p( & l_LAST_USED_BLOCK );
end;
/
---------------
实验:
SQL&gt; create table t001 as select * from all_tables;
p_num );
end;
begin
dbms_space.free_blocks
( segment_owner =&gt; p_owner,
segment_name =&gt; p_segname,
segment_type =&gt; p_type,
freelist_group_id =&gt; 0,
p( &#39;Total Bytes&#39;, l_total_bytes );
p( &#39;Unused Blocks&#39;, l_unused_blocks );
p( &#39;Unused Bytes&#39;, l_unused_bytes );
p( &#39;Last Used Ext FileId&#39;, l_LastUsedExtFileId );
COUNT(*)
----------
39040
SQL&gt; delete from t001 where rownum&lt;30001;
已删除30000行。
SQL&gt; commit;
提交完成。
SQL&gt; exec show_space(&#39;T003&#39;);
这样和以前Freelist的管理方法相比,数据库再分配空间的时候的并发性能大大提高
但ASSM的使用也有以下限制
a、ASSM只能位于本地管理的表空间
b、不能使用ASSM建立临时表空间
c、不能在ASSM的段中创建LOB对象
----------------------
HWM的检测:
通过tom的存储过程show_space可以很容易的看到空间的使用
Total Blocks............................40
Total Bytes.............................327680
Unused Blocks...........................2
Unused Bytes............................16384
------------------------
降低HWM的方法
MOVE
SQL&gt; alter table t003 move;
表已更改。
SQL&gt; exec show_space(&#39;T003&#39;);
Free Blocks.............................0
表被截断。
SQL&gt; exec show_space(&#39;T003&#39;);
Free Blocks.............................0
Total Blocks............................8
相关文档
最新文档