oracle执行计划

delete删除数据造成归档日志增加,操作系统空间不足导致数据库hang住

♀尐吖头ヾ 提交于 2019-11-27 07:03:25
业务需求,对日志表历史数据进行清理。历史表均很大,使用delete 操作删除90天前的数据。 第一部分:快速删除数据 SQL> alter table CC.F_LOG parallel 4; SQL>alter session enable parallel dml; SQL> delete FROM CC.F_LOG S WHERE S.CREATE_DATE>(SYSDATE-90);执行计划确定并行 ----------------------------------------------- | Id | Operation | ----------------------------------------------- | 0 | DELETE STATEMENT | | 1 | PX COORDINATOR | | 2 | PX SEND QC (RANDOM) | | 3 | INDEX MAINTENANCE | | 4 | PX RECEIVE | | 5 | PX SEND RANGE | | 6 | DELETE | | 7 | BUFFER SORT | | 8 | PX RECEIVE | | 9 | PX SEND HASH (BLOCK ADDRESS)| |* 10 | INDEX RANGE SCAN | -------------------

oracle递归函数

邮差的信 提交于 2019-11-27 01:37:06
oracle start with connect by 用法 oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = 'HBHqfWGWPy' connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中: 条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 条件3 是过滤条件,用于对返回的所有记录进行过滤。 简单介绍如下: 早扫描树结构表时

Oracle 建立索引及SQL优化

你离开我真会死。 提交于 2019-11-27 00:05:22
如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引。数据库索引主要进行提高访问速度。 建设原则:  1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。  2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。  3、不应该在小表上建设索引。 优缺点:  1、索引主要进行提高数据的查询速度。 当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡。 创建索引:  单一索引:Create Index <Index-Name> On <Table_Name>(Column_Name);  复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。   select * from emp where deptno=66 and job='sals' ->走索引。   select * from emp where deptno=66 OR job='sals' ->将进行全表扫描。不走索引   select * from emp where deptno=66 ->走索引。

Oracle SQL Trace、Tkprof和10046事件

让人想犯罪 __ 提交于 2019-11-26 20:37:24
一、SQL TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace文件来了解在这个SQL执行过程中Oracle都做了哪些操作。 可以通过sql命令启动SQL_TRACE,或者在初始化参数里面。 1 SQL > alter session set sql_trace = true; 2 3 Session altered. 4 ----- 或者----------- 5 SQL > alter system set sql_trace = true; 6 7 System altered. 这两条命令的区别: 在seesion级别设置,只对当前session进行跟踪,在实例级别,会对实例上所有的SQL做跟踪,这种方式跟踪的SQL太多,代价是非常大的,所以很少用。 如果是在初始化文件里面设置,只需要在参数文件里添加一个sql_trace参数即可。 示例: 1、确定当前的trace文件 1.1、通过设置trace文件标识 1 SQL > alter session set tracefile_identifier = ' jack_trace ' ; 2 3 Session altered.

初始化参数之cursor_sharing

徘徊边缘 提交于 2019-11-26 20:37:04
一、Cursor_sharing简介: 这个参数是用来告诉Oracle在什么情况下可以共享游标,即SQL重用。 Cursor_sharing参数有3个值可以设置: 1)、 EXACT:通常来说,exact值是Oracle推荐的,也是默认的,它要求SQL语句在完全相同时才会重用,否则会被重新执行硬解析操作 。 2)、 SIMILAR:similar是在Oracle认为某条SQL语句的谓词条件可能会影响到它的执行计划时,才会被重新分析,否则将重用SQL 。 3)、 FORCE:force是在任何情况下,无条件重用SQL 。 备注:上面所说的SQL重用,仅仅是指谓词条件不同的SQL语句,实际上这样的SQL基本上都在执行同样的业务操作。 二、在Cursor_sharing参数值不同的时对SQL的影响: 2.1 创建实验环境: ----首先创建一张jack表---- 1 SQL > create table jack (id int ,name varchar2 ( 10 )); 2 3 Table created. 4 ----产生一些数据---- 5 SQL > insert into jack values ( 1 , ' aa ' ); 6 7 1 row created. 8 9 SQL > insert into jack values ( 2 , ' bb ' ); 10 11

Oracle 执行计划中access 和 filter的区别

你。 提交于 2019-11-26 20:36:39
一、简要说明: Prediceate(谓词):一个查询中的WHERE限制条件。 在查看执行计划的信息中,经常会看到两个谓词filter和access,它们的区别是什么,理解了这个两个词对我们解读Oracle的执行计划信息会有所帮助。 简单地说,执行计划如果显示是 access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引), 而 filter表示谓词条件的值并不会影响数据访问路径,只起到过滤的作用 。 二、举例说明: ----创建一张表echo---- 1 SQL > create table echo as select * from dba_objects; 2 3 Table created. 4 5 SQL > set autotrace trace exp ; 6 SQL > set linesize 150 ; 7 SQL > select * from echo where object_id = 1000 ; 8 9 Execution Plan 10 -- -------------------------------------------------------- 11 Plan hash value: 642657756 12 13 -- ------------------------------------------------------

db_file_multiblock_read_count

淺唱寂寞╮ 提交于 2019-11-26 20:36:26
一、参数说明: 初始化参数db_file_multiblock_read_count是用来约束Oracle进行多数据块读取时的行为,所谓多数据块读取,就是Oracle在一次I/O时,可以读取多个数据块,从而用最小的I/O完成数据的读取。 db_file_multiblock_read_count的设置要受OS最大IO能力影响,也就是说,如果你系统的硬件IO能力有限,即使设置再大的db_file_multiblock_read_count也是没用的。 理论上,最大db_file_multiblock_read_count和系统IO能力应该有如下关系: Max(db_file_multiblock_read_count) = MaxOsIOsize/db_block_size 当然这个Max(db_file_multiblock_read_count)还要受Oracle的限制。 在这里引用一下Oracle 11g r2的Reference中关于db_file_multiblock_read_count的介绍: 二、实验说明: 在这里引用一下谭大师的《让Oracle跑得更快2》中的一个例子: ----创建一张表jack并插入一下数据---- 1 SQL > create table jack(x int ,y int ); 2 3 Table created. 4 5 SQL >

Oracle Bind Variable

拈花ヽ惹草 提交于 2019-11-26 20:35:57
Oracle Bind Variable(绑定变量)就其本质来说就是把本来需要Oracle做硬解析的SQL变成了软解析,以减少Oracle花费在SQL解析上的时间和资源。 我们设想一个银行ATM机系统,这是一个比较典型的OLTP系统,用户分别在不同的ATM机上做操作,其实所有的用户做的操作基本上是相同的,主要是这样3种,查询,取款,存款。 对于查询,发出的查询大概就是这样的一条SQL: Select account_value from account_info where acount_name = 'myname'; 而对于取款和存款,对于数据库来说是一样的,不过是修改当前账户上余额的一个数值: update account_info set account_value = new_value where account_name = 'myname'; 比如我们有两个用户A和B都分别查询了自己的余额,并且各自取了500块钱和1000块钱,那么他们各自发出的SQL分别是: 用户A: 1 select account_value from account_info where acount_name = ' A ' ; 2 update account_info set account_value = account - 500 where account_name = ' A

[转载]---Oracle SQL的硬解析和软解析

三世轮回 提交于 2019-11-26 20:35:53
我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。在Oracle中存在两种类型的SQL语句,一类为DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析。还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析。 DML:INSERT、UPDATE、DELETE、SELECT; DDL:CREATE、DROP、ALTER 一、SQL解析过程 Oracle对此SQL将进行几个步骤的处理过程: 1、语法检查(syntax check):检查此sql的拼写是否有语法错误; 2、语义检查(semantic check):诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限; 3、对sql语句进行解析(prase):利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan); 4、执行sql,返回结果(execute and return)。 二、解析过程详解 2.1、语法检测 判断一条SQL语句的语法是否符合SQL的规范,比如执行: 1 SQL > select * form emp; 2 select * form emp 3 * 4 ERROR at line 1 : 5 ORA - 00923 : FROM

[转载]---Oracle等待事件2之构造一个DB File Sequential Read等待事件和构造一个Direct Path Read等待事件...

丶灬走出姿态 提交于 2019-11-26 20:35:14
第一篇: 《Oracle等待事件1之分别用表和索引上数据的访问来产生db file scattered read等待事件》 第二篇: 《Oracle等待事件2之构造一个DB File Sequential Read等待事件和构造一个Direct Path Read等待事件》 第三篇: 《暂无》 三、构造一个DB File Sequential Read等待时间,等待事件需要在v$session_wait和10046 trace文件中显示出来,贴出整个演示过程。 db file sequential read等待事件:是由于数据块顺序读产生的,当数据块(索引块)从磁盘一个一个读到内存中时,在这个过程中oracle会发生"db file sequential read"等待事件。 块顺序读场景:索引块顺序读、数据块顺序读、undo回滚构造一致性读、磁盘I/O瓶颈 一般来讲如果检索数据时走索引范围扫描INDEX RANGE SCAN就会发生数据块顺序读的现象,先读取一个索引块,根据索引键值对应ROWID信息在去读ROWID所在的数据块,接下来继续找下一个索引块,在读对应的数据块,就这样一个一个把数据块读取到内存中,这个过程中就会产生"db file sequential read"等待事件。 下面我们来使用索引块顺序读来产生"db file sequential read" ---