Oracle XML DB之浅入浅出
备注:XML DB是Oracle 9.2中出现的新特性。 1 XML DB安装 通过DBCA安装 2 XML DB数据处理 2.1 存储XML数据到XML表中 2.1.1创建一个有XMLType类型字段的表: create table xmlcontent (keyvalue varchar2(10) primary key, xmlvalue xmltype); 2.1.2创建一个XMLType类型表 create table xmltable of xmltype; 2.1.3从XML文件中读取数据存储到XML表中 创建Directory指向存放XML文件的路径: SQL> grant create any directory to xdb; Gran
跳跃式索引(Skip Scan Index)的浅析
在Oracle9i中,有一个新的特性:跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS。此外,还可以通过使用提示index_ss(CBO下)来强制使用SS。 举例: SQL> create table test1 (a number, b char(10), c varchar2(10)); Table created. SQL> create index test_idx1 on test1(a, b); Index created. SQL> set autotrace on SQL> select /*+index_ss(test1 test_idx1)*/* from test1 a 2 where
配置hacmp5.2 的Rotating方式
首先要说明的是,在Hacmp5.2以后,不再有Rotating、Cascading、ConCurrent之分了。而是通过针对Startup、Failover、Fallback设置不同的策略来实现。并且,在5.3以后,将完全不再支持Rotating方式了。 第1章 网络规划和配置 1.1 网络规划 小型机名 主用网卡IP 备用网卡IP 心跳串口 浮动IP地址 power1 10.71.111.231 到现场后需要修改主用网卡的IP地址 192.168.8.1 /dev/tty0 10.71.111.235 power2 10.71.111.232 到现场后需要修改主用网卡的IP地址 192.168.8.2 /dev/tty0
利用Oracle 10g SQL优化器(STA)优化语句(1)
SQL优化器(SQL Tuning Advisor STA)是Oracle10g中推出的帮助DBA优化工具,它的特点是简单、智能,DBA值需要调用函数就可以给出一个性能很差的语句的优化结果。下面介绍一下它的使用。 使用STA一定要保证优化器是CBO模式下。 一、利用STA优化语句 对于问题语句的收集,可以通过Oracle10g的另一个自动化工具:数据库自动诊断监视工具(ADDM)。它的使用可以参照我的另一篇文章《Oracle10g数据库自动诊断监视工具(ADDM)使用指南》。 我们下面简单介绍一下如何优化一条找到的问题语句。正如前面所述说的,STA是用起来很简单(只要你会调
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(3)
我们从上面的建议结果看到了,ADDM Report的结果与Statspack Report的结果大不相同。Statspack Report的结果给出的都是统计数据、各种事件,然后由DBA根据这些数据给出优化建议,而ADDM Report的结果包含就已经是给出的优化建议了(汗!DBA以后要失业了!) 第一部分: Analysis Period: 23-NOV-2005 from 15:02:27 to 16:06:42 Database ID/Instance: 1712582900/1 Database/Instance Names: EDGAR/edgar Host Name: HUANGED Database Version: 10.2.0.1.0 S
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(2)
第六步:查看优化建议结果 通知函数dbms_advisor.get_task_report可以得到优化建议结果。 SQL> SET LONG 1000000 PAGESIZE 0 LONGCHUNKSIZE 1000SQL> COLUMN get_clob FORMAT a80SQL> SELECT dbms_advisor.get_task_report('DEMO_ADDM01', 'TEXT', 'ALL') FROM DUAL; DBMS_ADVISOR.GET_TASK_REPORT('-------------------------------------------------------------------------------- DETAILED ADDM REPORT FOR TASK 'DEMO_ADDM01' WITH ID 243 -------------------------------------------------------
Oracle 10g新特性——选择性编译
Oracle10g中提供了一个十分方便开发人员的新特性——选择性编译。即可以通过条件,只编译PL/SQL中的部分代码。如果你对C++很熟悉,那你会对这个特性感觉非常亲切,因为它和C++中的条件宏十分相似。在9i的时候,开发人员将自己的调试信息加入到程序中,往往release之后都没有删掉,这些信息轻则影响可读性,严重的话会影响系统性能。有了这个特性后,这个问题就可以解决了。 下面举个简单的例子解释一下: 创建一个有条件宏的函数:SQL> CREATE OR REPLACE FUNCTION F_TESTDEBUG 2 RETURN NUMBER IS 3 v_count number; 4 B
Oracle10g数据库自动诊断监视工具(ADDM)使用指南(1)
第一章 ADDM简介 在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof、sql_trace、statspack、set event 10046&10053等等。这些工具能够帮助DBA很快的定位性能问题。但这些工具都只给出一些统计数据,然后再由DBA们根据自己的经验进行优化。 那能不能由机器自动在统计数据的基础上给出优化建议呢?Oracle10g中就推出了新的优化诊断工具:数据库自动诊断监视工具(Automatic Database Diagnostic Monitor ADDM)和SQL优化建议工具(SQL Tuning Advisor STA)。这两个工具的结合使用,能使DBA节省大
Oracle 10g新特性——正则表达式
在进行查询时,有时候需要按照一定的特殊规则来查找某个字符串,比如,你可能需要查询第三位为5-8,最后四位为’8888’的所有电话。在9i之前,你可能需要写一个很复杂的条件: Select username from t_userinfo where (phonenumber like ‘135%8888’ or phonenumber like ‘136%8888’ or phonenumber like ‘137%8888’ or phonenumber like ‘138%8888’) and length(phonenumber) = 13; 那时就会很羡慕java程序员可以使用一个正则表达式轻松搞定。10g中,再也不需要这么复杂了, oracle也提供了几个正则
Oracle 10g新特性——代码混淆
Oracle 9i之前,提供了一个命令’warp’来加密代码。但它是命令行方式的,是针对脚本的。10g中,Oracle包DBMS_DDL提供了一个新的函数CREATE_WRAPPED来实现对代码的混淆。举例: SQL> declare 2 V_PROTEX varchar2(2000):=' 3 CREATE OR REPLACE PROCEDURE P_WRAPTEST 4 IS 5 v_count number; 6 BEGIN 7 select count(*) into v_count from user_tables; 8 DBMS_OUTPUT.PUT_LINE(''Tables number is: '' || v_count); 9 END; 10 '; 11 begin 12 SYS.DBMS_DDL.CREATE_WRAPPED(V
各种语句的不同写法
最近处理的问题涉及SQL Tuning的东西比较多。不少语句不是加几个索引这么简单,而是语句是在太复杂了,有些作者都不知道是谁,逻辑非常难理解。碰到这种情况着实令人头疼。但是根据经验,很多语句的书写方式是可以用其他方式代替,通过尝试修改语句的写法,往往取得不错的效果。 当然,改变语句的写法只是语句优化的一种手段之一,在这个基础上,在结合其他的优化手段(采用PLSQL块提花单个语句、采用游标、提示等)才能取得最好的优化效果。以下的替换中,大多数情况下,右边的写法会优于左边的写法,并且根据等价原理进
普通物理表、临时表和TABLE(函数)的执行效率对比
普通物理表、临时表和TABLE的用途各不相同,普通表一般存放需要长期保存的数据,临时表存放某个事务或会话过程中的临时数据,array是oracle中的数组,也可以用于存放临时数据,或在OODB中使用。但是,优化器在做查询计划时,尤其在CBO中,没临时表和TABLE的统计数据,因此总会得出一些混乱的查询计划,往往需要我们用hint去调整。并且,由于实现机制各不相同,他们的查询效率也不一样。下面通过一个简单的测试来对比他们之间的查询效率,以便于在可选的情况下选择最优的实现方式: 创建相关对象: 创建物理表:CREATE TABLE tmp_obj (
Oracle的语句中的提示(5)
USE_HASH(table) 作用:将指定表保存在内存hash表,快速的与其他表连接在一起。 注意:要使用USE_HASH,必须保证HASH_AREA_SIZE和PGA_AGGREGATE_TARGET足够大。 例子: SQL>select /*+use_hash(a)*/ a.f1_num2, b.f3_numnull from t_wei a, t_huang b where a.f1_num2=b.f1_num and a.f1_num2 < 1000 and b.f3_numnull < 10000; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=300 Bytes=11 700) 1 0
Oracle中的Hash Join祥解
一、 hash join概念 hash join(HJ)是一种用于equi-join(而anti-join就是使用NOT IN时的join)的技术。在Oracle中,它是从7.3开始引入的,以代替sort-merge和nested-loop join方式,提高效率。在CBO(hash join只有在CBO才可能被使用到)模式下,优化器计算代价时,首先会考虑hash join。 可以通过提示use_hash来强制使用hash join,也可以通过修改会话或数据库参数HASH_JOIN_ENABLED=FALSE(默认为TRUE)强制不使用hash join。 Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的
Oracle的语句中的提示(4)
NO_EXPAND 作用:禁止优化器使用OR扩展。如果不使用NO_EXPAND,优化器会产生很长的执行计划。 例子: SQL>select /*+no_expand*/* from t_fuyuncat where f1_num3 < 100 or f2_char3 < ‘100’; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=39 Card=1943 Bytes=1 22409) 1 0 TABLE ACCESS (FULL) OF 'T_FUYUNCAT' (Cost=39 Card=1943 Byt es=122409) Statistics ----------------------------
Oracle的语句中的提示(3)
INDEX_COMPILE 作用:与INDEX相同,但是只用于位图索引 例子:略 INDEX_ASC 作用:与INDEX类似,只不过对索引按升序扫描。 例子:略 INDEX_DESC 作用:与INDEX类似,只不过对索引按降序扫描。 例子:略 INDEX_FFS 作用:执行一次索引的快速全局扫描。这个提示只访问索引,而不访问表。只有当要查询的内容都属于索引时,这个提示才有意义。 例子: SQL>select /*+index_ffs(t_wei pk_t_wei)*/ f1_num2 from t_wei; Execution Plan ---------------------------------------------------------- 0 SELECT STATE
Oracle的语句中的提示(2)
INDEX[(table index1, index2…)] 作用:强制使用一个或多个索引。在某些情况下(特别是在使用基于成本的优化规则下),Oracle优化器不能正确选择所有,可以通过使用这个提示强制指定使用某一个或多个索引。 例子: SQL>select /*+index(t_huang PK_T_HUANG)*/ * from t_huang where f1_num < 100 and f2_char > ‘10000’ and f3_numnull >1000; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=66 Bytes=415
Oracle的语句中的提示(1)
前导 这所提到的提示,都是Oracle9i的提示。一个语句中,可以含有一个或多个提示,当含有多个提示时,某些或者全部提示会失效。 提示中表名可以是别名。 为了更好的理解这些提示,先建立以下一些表。为了更加容易理解,会对一些常用提示给出例子,并给出对比,加深对提示的理解。 create table t_huang (f1_num number(10) not null, f2_char varchar2(20) not null, f3_numnull number(10) null, f4_num number(10), f5_char varchar2(20)); alter table t_huang add constraint PK_T_HUANG primar
RAC的load balance和failover的配置过程
在一个RAC中存在两个节点:power1和power2,service_name是P5,SID分别为P51,P52 1、参数设置 power1: SQL> show parameter db_name NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_name string P5 SQL> show parameter db_domain NAME TYPE VALUE ------------------------------------ ----------- ---------------------------
创建监控表的DML的触发器
在生产环境中,总是可能出现这样的情况:某张或者某些表的数据被莫名其妙的修改了,但是很难定位出是哪个用户、哪个过程修改的。这是一个很让DBA头痛的事情(往往DBA对于整个代码逻辑并不是非常了解)。要定位出“问题”语句,有几种方法可以选择:log miner;细节粒度审计;触发器。Log miner要求要有归档日志(这个并非所有系统都可以做),而且需要有相当的磁盘空间,好处就是可以离线做;细节粒度升级能够根据条件记录下表的DML操作(9i及之前只能记录SELECT语句),比较复杂的FGA需要较高权限的用户来实现;触发器比较灵活,能够按照