oracle 写入数据的过程
1、事务开始;2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。附:checkpoint由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data
oracle 流技术(转),用于学习
Oracle 流提供了一种在数据库之间共享消息和数据的简单而灵活的方法。例如, 您可以使用流, 作为事件捕获对数据库对象所进行的 DML 和 DDL 更改。然后您可以将这些事件传播到其他数据库, 从而有效地将数据库对象复制到其他数据库。 Oracle 流包括三个主要过程: 捕获, 用来捕获对重做日志中数据库对象的更改。这些更改将放置在一个队列中。 传播, 用来将更改从源数据库中的队列传播到目标数据库中的队列。 应用, 用来从目标队列区域检索更改并应用于数据库。 使用stream流复制环境作表级或模式schema级甚至DB级的数据复制,本脚本仅供参考(详
ORACLE集合常用方法
集合方法pl/sql预定义了在varray 和嵌套表实例上进行调用的方法。这些方法能在集合上执行一定的功能。EXISTS该函数返回集合中第一个元素的索引,如果集合为空,返回NULLCollection.EXISTS(index)COUNT该函数集合元素的数目Collection.COUNTDELETE该过程从嵌套表中删除一个或多个或合部元素Table_name.DELETE 删除所有元素Table_name.delete(index)删除指定索引的记录Table_name.delete(start_index,end_index)删除区间内元素FIRST返回集合第一个元素索引,如果集合为空,返回NULLCollection.FIRSTLAST返回集合中最后一个元素索引,如果集合
ORACLE中的异常(转)
1、异常的优点 如果没有异常,在程序中,应当检查每个命令的成功还是失败,如 BEGIN SELECT ... -- check for ’no data found’ error SELECT ... -- check for ’no data found’ error SELECT ... -- check for ’no data found’ error 这种实现的方法缺点在于错误处理没有与正常处理分开,可读性差,使用异常,可以方便处理错误,而且异常处理程序与正常的事务逻辑分开,提高了可读性,如 BEGIN SELECT ... SELECT ... SELECT ... ... EXCEPTION WHEN NO_DATA_FOUND THEN -- ca
关于事务对数据块的操作过程的分析和试验(2)(转)
快速提交 当一个事物访问一个数据块时,它会占用数据块Itl中的一个条目,记录下事务ID(Xid)、该事务对该数据块操作时使用的回滚块地址(Uba)和在该数据块上产生的行级锁的数量,并在对应数据行上打上行锁标志,与Itl对应。当提交时,设置Itl中的事物标志为U,并写入一个快速提交SCN(Fsc),但并不清除锁标志。这就是快速提交。 看下面的一个试验。 先对数据块进行修改,然后dump出数据块:SQL> conn demo/demoConnected.SQL>SQL> alter system flush buffer_cache; System altered. SQL>SQL> update t_
关于事务对数据块的操作过程的分析和试验(1)(转)
事务和数据块这里主要想通过试验来推断Oracle的事务在数据块(Oracle中存储的最小单位)上一些微观操作,以便于更好的理解Oracle的事务控制、一致性处理及锁冲突。创建测试表:SQL> create table t_multiver (a number, b number); Table created. SQL> insert into t_multiver values (1,1); 1 row created. SQL> insert into t_multiver values (2,2); 1 row created. SQL> insert into t_multiver values (3,3); 1 row created. SQL>SQL> commit; Commit complete.首先,看一下数据块上和记录有关的标示,dump一个数
各种分区类型详解(带图)和索引分区
范围分区CREATE TABLE sales_range (salesman_id NUMBER(5), salesman_name VARCHAR2(30), sales_amount NUMBER(10), sales_date DATE) PARTITION BY RANGE(sales_date) ( PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','MM/DD/YYYY')), PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','MM/DD/YYYY')), PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','MM/DD/YYYY')), PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','MM/DD/YYYY')) );列表分
analyze table 的各种语法及对应工作机制
SQL> CREATE TABLE a AS SELECT * FROM all_objects;CREATE TABLE b AS SELECT * FROM all_objects;CREATE TABLE c AS SELECT * FROM all_objects;CREATE TABLE d AS SELECT * FROM all_objects;Table created.SQL> Table created.SQL> Table created.SQL> Table created.SQL> CREATE UNIQUE INDEX unq_a ON etl.a(OBJECT_ID);CREATE UNIQUE INDEX unq_b ON etl.b(OBJECT_ID);CREATE UNIQUE INDEX unq_c ON etl.c(OBJECT_ID);CREATE UNIQUE INDEX unq_d ON etl.d(OBJECT_ID);Index created.SQL> Index created.SQL>
oracle 管理常用命令
第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> alter system checkpoint; 3.adding online redo log groups sql> alter database add logfile [group 4] sql> ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m; 4.adding online redo log members sql> alter database add logfile member sql> '/disk3/log1b.rdo' to group 1, sql> '/disk4/log2b.rdo' to group 2; 5.changes the name of the online redo logfile sql> alter database rename file
oracle table()函数用法
PL/SQL表---table()函数用法 /*PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table。oracle内存表在查询和报表的时候用的比较多,它的速度相对物理表要快几十倍。simple example:1、table()结合数组:*/create or replace type t_test as object(id integer,rq date,mc varchar2(60));create or replace type t_test_table as table of t_test;create or replace function f_test_array(n in number default null) return t_test_tableas v_test t_test_table := t_test_table();beginfor i in 1 .. n
关于 pipe row的用法(转,待做实验)
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。管道化表函数必须返回一个集合。在函数
关于嵌套表为record类型与bulk bind的结合使用
在PL/SQL中,BULK In-BIND与RECORD,%ROWTYPE是不能在一块使用的,也就是说,BULK In-BIND只能与简单类型的数组一块使用,这样导致如果有多个字段需要用BULK In-BIND来处理的话,代码就比较复杂:declaretype tab_test is table of tmp_0925%rowtype;v_id tab_test;cursor cur_aids is select *from tmp_0925where rn >= v_begin and rn <= v_end;beginopen cur_aids;fetch cur_aids bulk collect into v_id;v_cnt := v_id.count;forall j in 1..v_cntupdate testset (id, name, age) = (select v_id(j).id, v_id(j).name, v_id(j).
关于高水位线和delete
因为oralce有一个HWM高水位,它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出现使用delete删除数据以后,查询的速度还是和delet
关于COUNT STOPKEY的工作机制
SQL> select rownum rn ,a.* from cnmir.ew_auctions a where rownum<50000;Execution Plan----------------------------------------------------------Plan hash value: 721966694----------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49999 | 4833K| 163 (2)| 00:00:0
关于hextoraw()与utl_raw.cast_to_raw及rawtohex()
SQL> create table test_raw (raw_col raw(10)); 表已创建。 SQL> insert into test_raw values (hextoraw('ff')); 已创建 1 行。 SQL> insert into test_raw values (hextoraw('0')); 已创建 1 行。 SQL> insert into test_raw values (hextoraw('23fc')); 已创建 1 行。 SQL> insert into test_raw values (hextoraw('fffffffffff')); 已创建 1 行。 SQL> insert into test_raw values (hextoraw('ffffffffffffffffffff')); 已创建 1 行。 SQL> insert into test_raw values (utl_raw.cast_to_raw('051')); 已创建
数据库的编码浅谈(ZHS16GBK与US7ASCII)
SQL> SELECT RAWTOHEX('郭A军') from dual;B9F941BEFCSQL> select dump('郭A军') from dual;Typ=96 Len=5: 185,249,65,190,252SQL> select chr(185)||chr(249)||chr(65)||chr(190)||chr(252) from dual;郭A军请注意:在ASC码和十六进制码中,185对应B9,249对应F9,65对应41,190对应BE,252对应FC而编码时,185,249两个字节构成"郭"字,65一个字节构成"A"字,190,252两个字节构成"军"字.本机测试环境中编码是US7ASCII,是一个字节为一个存储单位,对于中文字的处理方式是用两个存储单位连接起来形成中文字的
关于ORACEL与异构数据库之间建立dblink
db link只能是oracle与oracle之间,不能是oracle与异构数据库之间,它们之间可以通过透明网关来实现!实现后也可以通过DBLINK连接,不过这种DBLINK是一种透明的机制[@more@]
ORACLE优化器工作原理及及执行方式
Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(Optimizer)来完成的。不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。相信你一定会用pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、First rows、All rows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计划就变了?1、优化器的优化方式Oracle的优化器共有两种的优化方式,即基于规则的优化
ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:1. /*+ALL_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.例如:SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=’SCOTT’;2. /*+FIRST_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.例如:SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=’SCOTT’;3. /*+CHOOSE*/表明如果数据字典中有访问表的统计信息,将基于开销的优化
关于/*+append*/的一点小常识
今天倒数据时,对A表数据使用/*+append*/方式倒入到C表中,同时启了另一个进程使用/*+append*/将B表数据倒入C表中,结果造成了死锁,查了一下资料,才发现,使用/*+append*/方式时,会锁住全表,包括不允许其它进程对该表执行DML操作,故死锁,以后应该注意![@more@]