下面是小编给各位读者分享的说一说 Oracle库的Hang数据库教程,欢迎大家分享。本文原稿由网友“忌廉沟鲜奶”提供。
篇1:说一说 Oracle库的Hang数据库教程
oracle
有些时侯,我当然指的是非常少的情况下,我们会感觉我们的库”Hang”了,加了隐号的意思是说有时真的是Hang了,有一些则不是,是由于性能的问题引起的,我遇到过几次Hang的情况,结合着网上一些文章,把可能的原因、当时我们应该做的一些操作进行了如下的总结,不对的地方大家可以发Mail给我:qiuyb@21cn.com。
一、数据库Hang时可能的现象
1、最直观的是你的大部分的业务操作,比如说一个查询都使用好长的时间,或根本就返回不出结果。这和简单那种锁表是有区别的。
2、在操作系统上用Hp-unix用glance、Aix用nmon及用sar做监测会出现系统空闲的假象,表面看起来系统很闲,实际上系统已经Hang了。
3、查v$session_wait会出现大量的”latch free”、”enqueue”、” free buffer waits”等等待事件,有时后台会出现大量的.trc文件,另外需要观注一下$ORACLE_HOME/rdbms/log这个位置,有一些时侯trace文件会生成到这里。
二、Oracle库Hang时一些有用的操作和查询
1、如果要寻求Oracle的技术支持,我们需要dump一下Oracle的systemstate,操作如下
SQL>conn / as sysdba;
SQL>alter session set events 'immediate trace name SYSTEMSTATE level 10';
需要等几分钟的时间,这时在init
2、捕获一些视图的状态值
SQL>conn / as sysdba;
SQL>set linesize 500
SQL>set pagesize 0
SQL>spool v_views.txt
SQL>SELECT * FROM v$parameter;
SQL>SELECT class, value, name FROM v$sysstat;
SQL>SELECT sid, id1, id2, type, lmode, request FROM v$lock;
SQL>SELECT l.latch#, n.name, h.pid, l.gets, l.misses, l.immediate_gets, l.immediate_misses, l.sleeps FROM v$latchname n, v$latchholder h, v$latch l WHERE l.latch# = n.latch# AND l.addr = h.laddr(+);
SQL>SELECT * FROM v$session_wait ORDER BY sid; --隔几秒重复执行3次,
SQL>spool off
3、有条件的话用statspack生成了一个Report,如果你对statspach不熟悉,可以参照www.itpub.net/showthread.php?s=&threadid=144448这个链接。
三、产生Hang可能的几个原因
1、开归档的情况下,归档位置所在的文件系统满了,这时lgwr就会等待归档进程的完成,DML写不了日志,都处于等待的状态。
2、在HP的系统开异步Io时,没为dba的组设置MLOCK权限。正常来说Oracle的启动是会报错的,可是有些时侯比如Oracle8.1.6的版本就不报错启动,但是此时的异步Io是有问题的,仔细查看你会在$ORACLE_HOME/rdbms/log看到大量的.trc文件。这种情形引的Hang我遇到过。
3、由于异常进程引起的,我所说的是那些占用系统资源(cpu,memory)特别大的进程,这些进程一般占用cpu会达到90%以上,相对其它的进程比较突出。可以通过hp-unix的glance、topas,IBM的nmod,topas,ps等工具进行监测。
4、由于主机系统、阵列的某方面的瓶颈引起的,在实际中最普遍的应该是Io的问题,比如IO方面有瓶颈,则dbwr、lgwr就会引” free buffer waits”、” log buffer space”等一系列的等待事件,此时是性能的问题,感觉起来像Hang。
5、也有bug的因素,我的库都是最新的补丁,这方面的问题还没遇到过。
四、几点处理建议
当得到Oracle的库奇慢或Hang时保持冷静的头脑很重要的,可以按如下的方法进行一些处理:
1、首先要到操作系统上去,用glance等工具进行一下观察,看一下cpu、内存、交换区、磁盘的繁忙程度与平时是不是相似的,同时看一看有没有占系统资源特别大的进程,有些时侯是这些进程引起的,通过v$process和v$session两个视图找到这Oracle进程的sid,serial#,把它用Alter system kill session ‘sid,serial#’;杀掉就行了。如果平时同样的时段你的磁盘的繁忙程度是95%,而些时它为20%,当然是假设了,说明Oracle的库没准真的hang了。
2、时间来得及的话执行一下”二”中的语句是很必要的,这样可以把这些信息提交给Oracle的supporter,让你们给你分析一下,查一下原因。
3、如果你的库开归档了,出现Hang的时侯一定要看一下归档日志的文件系统是不是满了,做一个完备一些的网管系统是很必要的。
4、在HP系统上打开异步IO时一定不要忘记为dba这个组加上MLOCK的权限,我就吃过这个亏。
5、时常的观注一下v$session_wait或用statspack进行观注一下等待事件,一般IO相关的事件较多,为Oracle打开异步IO、多加几个写进程及为Oracle数据文件所用的raw device使用条带都是很必要的。与应用的开发商交流也很重要,没准最近新上的一个应用就特耗IO或特占CPU资源。
6、尽量要使用比较稳定的Oracle的版本,比如Oracle8.1.7.4及Oracel9.2.0.4(最新为 9.2.0.5)都很稳定的,可以少去好多的麻烦。
篇2:Oracle 9i 约束条件数据库教程
约束条件就是Oracle数据库系统提供的对数据的完整性进行制约的机制,
Oracle 9i 约束条件数据库教程
。Oracle 9i允许创建5种约束条件。参见表7.8。创建检查约束条件
(1)在【管理目标导航器】中按照7.6节修改数据表结构的步骤进行操作。
(2)切换到图7.61所示的编辑表的【约束条件】选项卡。
(3)上述创建检查约束条件的SQL码如下?br> DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
ALTER TABLE “SCOTT”.“STUDENT”
ADD (CONSTRAINT “研究生编号检查约束条件”
CHECK(student_id>= and student_id<=0909))
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【参见光盘文件】:\\第7章\\ createcheck.sql。
(4)读者也可以直接在【SQLPlus Worksheet】中执行createcheck.sql 文件完成检查约束条件的创建,如图7.62所示,
测试检查约束条件
(1)在7.63所示的【表数据编辑器】界面中按照图示内容输入,单击“应用(P)”按钮。
(2)上述输入数据的SQL代码如下。
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
INSERT INTO “SCOTT”.“STUDENT”
(“STUDENT_ID” ,“NAME” ,“PROFESSIONAL” ,“BIRTHDAY” ,“DIRECTOR_ID” )
VALUES (20010101 ,'纪晓芙' ,'软件工程' ,TO_DATE('15-7月 -1971', 'dd-Mon-yyyy HH:MI:SS AM') ,01)
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
【参见光盘文件】:\\第7章\\ testcheck.sql。
(3)出现如图7.64所示界面。
(4)读者也可以直接在【SQLPlus Worksheet】中执行testcheck.sql 文件完成检查约束条件的测试,结果如图7.65所示。
篇3:删除Oracle 9i数据库数据库教程
(1)启动【数据库配置助手】,一直到出现如图6.44所示的【操作】界面,
删除Oracle 9i数据库数据库教程
。(2)出现如图6.45所示的【数据库】界面,
(3)出现如图6.46所示的【概要】界面。
(4)出现如图6.47所示的【删除确认】界面。
(5)成功删除数据库后出现如图6.48所示的【成功境】界面。单击“否”按钮?br>
篇4:优化Oracle库表设计的若干方法数据库教程
oracle|设计|优化
前言绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的,只有少部分问题根植于Database Buffer、Share Pool、Redo Log Buffer等内存模块配置不合理,I/O争用,CPU争用等DBA职责范围上,所以除非是面对一个业已完成不可变更的系统,否则我们不应过多地将关注点投向内存、I/O、CPU等性能调整项目上,而应关注数据库表本身的设计是否合理,库表设计的合理性才是程序性能的真正执牛耳者。
合理的数据库设计需要考虑以下的方面:
・业务数据以何种方式表达。如一个员工有多个Email,你可以在T_EMPLOYEE表中建立多个Email字段如email_1、email_2、email_3,也可以创建一个T_EMAIL子表来存储,甚至可以用逗号分隔开多个Email地址存放在一个字段中。
・数据以何种方式物理存储。如大表的分区,表空间的合理设计等。
・如何建立合理的数据表索引。表索引几乎是提高数据表查询性能最有效的方法,Oracle拥有类型丰富的数据表索引类型,如何取舍选择显得特别重要。
本文我们将目光主要聚焦于数据表的索引上,同时也将提及其他两点的内容。通过对一个简单的库表设计实例的分析引出设计中的不足,并逐一改正。考虑到手工编写库表的SQL脚本原始且低效,我们将用目前最流行的库表设计工具PowerDesigner 10来讲述表设计的过程,所以在本文中你还会了解到一些相关的PowerDesigner的使用技巧。
一个简单的例子
某个开发人员着手设计一个订单的系统,这个系统中有两个主要的业务表,分别是订单基本信息表和订单条目表,这两张表具有主从关系的表,其中T_ORDER是订单主表,而T_ORDER_ITEM是订单条目表。数据库设计人员的设计成果如图 1所示:
图 1 订单主从表
ORDER_ID是订单号,为T_ORDER的主键,通过名为SEQ_ORDER_ID的序列产生键值,而ITEM_ID是T_ORDER_ITEM表的主键,通过名为SEQ_ORDER_ITEM的序列产生键值,T_ORDER_ITEM通过ORDER_ID外键关联到T_ORDER表。
需求文档指出订单记录将通过以下两种方式来查询数据:
・CLIENT + ORDER_DATE+IS_SHPPED:根据“客户+订货日期+是否发货”条件查询订单及订单条目。
・ORDER_DATE+IS_SHIPPED:根据“订货日期+是否发货”条件查询订单及订单条目。
数据库设计人员根据这个要求,在T_ORDER表的CLIENT、ORDER_DATE及IS_SHPPED三字段上建立了一个复合索引IDX_ORDER_COMPOSITE;在T_ORDER_ITEM为外键ORDER_ID建立IDX_ORDER_ITEM_ORDER_ID索引。
让我们看一下该份设计的最终SQL脚本:
/*订单表*/
create table T_ORDER (
ORDER_ID NUMBER(10) not null,
ADDRESS VARCHAR2(100),
CLIENT VARCHAR2(60),
ORDER_DATE CHAR(8),
IS_SHIPPED CHAR(1),
constraint PK_T_ORDER primary key (ORDER_ID)
);
create index IDX_CLIENT on T_ORDER (
CLIENT ASC,
ORDER_DATE ASC,
IS_SHIPPED ASC);
/*订单条目子表*/
create table T_ORDER_ITEM (
ITEM_ID NUMBER(10) not null,
ORDER_ID NUMBER(10),
ITEM VARCHAR2(20),
COUNT NUMBER(10),
constraint PK_T_ORDER_ITEM primary key (ITEM_ID)
);
create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM (
ORDER_ID ASC);
alter table T_ORDER_ITEM add constraint FK_T_ORDER__REFERENCE_T_ORDER foreign key (ORDER_ID) references T_ORDER (ORDER_ID);
我们承认在ER关系上,这份设计并不存在的缺陷,但却存在以下有待优化的地方:
・没有将表数据和索引数据存储到不同的表空间中,而不加区别地将它们存储到同一表空间里。这样,不但会造成I/O竞争,也为数据库的维护工作带来不便。
・ORACLE会自动为表的主键列创建一个普通B-Tree索引,但由于这两张表的主键值都通过序列提供,具有严格的顺序性(升序或降序),此时手工为其指定一个反键索引(reverse key index)将更加合理。
・在子表T_ORDER_ITEM外键列ORDER_ID上建立的IDX_ORDER_ITEM_ORDER_ID的普通B-Tree索引非常适合设置为压缩型索引,即建立一个压缩型的B-Tree索引。因为一份订单会对应多个订单条目,这就意味着T_ORDER_ITEM表存在许多同值的ORDER_ID列值,通过将其索引指定为压缩型的B-Tree索引,不但可以减少IDX_ORDER_ITEM_ORDER_ID所需的存储空间,还将提高表操作的性能。
・企图仅通过建立一个包含3字段IDX_ORDER_COMPOSITE复合索引满足如前所述的两种查询条件方式的索引是有问题的,事实上使用ORDER_DATE+IS_SHIPPED复合条件的查询将利用不到IDX_ORDER_COMPOSITE索引。
优化设计
1、将表数据和索引数据分开表空间存储
1.1 表数据和索引为何需要使用独立的表空间
Oracle强烈建立,任何一个应用程序的库表至少需要创建两个表空间,其中之一用于存储表数据,而另一个用于存储表索引数据。因为如果将表数据和索引数据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和索引数据存放在不同的表空间中(如一个为APP_DATA,另一个为APP_IDX),并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。
拥有独立的表空间,就意味着可以独立地为表数据和索引数据提供独立的物理存储参数,而不会发生相互影响,毕竟表数据和索引数据拥有不同的特性,而这些特性又直接影响了物理存储参数的设定。
此外,表数据和索引数据独立存储,还会带来数据管理和维护上的方面。如你在迁移一个业务数据库时,为了降低数据大小,可以只迁出表数据的表空间,在目标数据库中通过重建索引的方式就可以生成索引数据了。
1.2 表数据和索引使用不同表空间的SQL语法
指定表数据及索引数据存储表空间语句最简单的形式如下。
将表数据存储在APP_DATA表空间里:
create table T_ORDER ( ORDER_ID NUMBER(10) not null, …)tablespace APP_DATA;
将索引数据存储在APP_IDX表空间里:
create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC)tablespace APP_IDX;
1.3 PowerDesigner中如何操作
1) 首先,必须创建两个表空间。通过Model->Tablespace...在List of Tablespaces中创建两个表空间:
图 2 创建表空间
2) 为每张表指定表数据存储的表空间。在设计区中双击表,打开Table Properties设计窗口,切换到options 页,按图 3所示指定表数据的存储表空间。
图 3 指定表数据的存储表空间
3) 为每个索引指定索引数据的存储表空间。在Table Properties中切换到Indexes页,在这里列出了表的所有索引,双击需设置表空间的索引,在弹出的Index Properties窗口中切换到Options页,按如下方式指定索引的存储表空间。
图 4 指定索引数据的存储表空间
将表空间的问题延展一下:一个应用系统库表的表空间可以进行更精细的划分。
首先,如果表中存在LOB类型的字段,有为其指定一个特定的表空间,因为LOB类型的数据在物理存储结构的管理上和一般数据的策略有很大的不同,将其放在一个独立的表空间中,就可方便地设置其物理存储参数了。
其次,需要考虑库表数据的DML操作特性:根据DML(INSERT,UPDATE,DELETE)操作频繁程度,将几乎不发生任何DML操作的数据放在独立的表空间中,因为极少DML操作的表可设置符合其特性的物理参数:如PCTFREE可置为0,其BUFFER_POOL指定为KEEP,以便将数据缓存在KEEP数据缓存区中等等,不一而足。
此外,还可以考虑按业务需要将不同的业务模块分开存放,这主要是考虑到备份问题。假设我们有一部分业务数据重要性很强,而其他的业务数据重要性相对较弱,这样就可以将两者分开存储,以便设置不同的备份策略。
当然,无节制的细化表空间也将带来管理上和部署上的复杂,根据业务需求合理地规划表空间以达到管理和性能上的最佳往往需要更多的权衡。
2、显式为主键列建立反向键索引
2.1 反向键索引的原理和用途
我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况,默认的B-Tree索引并不理想。这是因为如果索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B-Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操作。因而,减少索引的层级数是索引性能调整的一个重要方法。
如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的“歪树”,如图 5所示:
图 5不对称的B-Tree索引
而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,如图 6所示:
图 6对称的B-Tree索引
比较图 5和图 6,在图 5中搜索到A块需要进行5次I/O操作,而图 6仅需要3次I/O操作。
既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列的值进行反向,即预先对列值进行比特位的反向,如1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较对称,从而提高表的查询性能。
但反向键索引也有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 和 = 的比较操作时,其反向键索引才会得到使用。
2.2 反向键索引的SQL语句
回到我们上面的例子,由于T_ORDER和T_ORDER_ITEM的主键值来源于序列,主键值是有严格顺序的,所以我们应该摒弃默认的Oracle所提供的索引,而采取显式为主键指定一个反向键索引的方式。
ORDER_ID为T_ORDER表的主键,主键名为PK_ORDER,我们为ORDER_ID列上建立一个反向键索引IDX_ORDER_ID,并使PK_ORDER_ID使用这个索引,其SQL语句如下:
create table T_ORDER (
ORDER_ID NUMBER(10) not null,
CLIENT VARCHAR2(60),
ADDRESS VARCHAR2(100),
ORDER_DATE CHAR(8));
create unique index IDX_ORDER_ID on T_ORDER ( ORDER_ID ASC) reverse;alter table T_ORDER add constraint PK_ORDER primary key (ORDER_ID) using index IDX_ORDER_ID;
要保证创建IDX_ORDER_ID的SQL语句在创建PK_ORDER主键的SQL语句之前,因为主键需要引用到这个反向键索引,
由于主键列的数据是唯一的,所以为IDX_ORDER_ID加上unique限定,使其成为唯一型的索引。
2.3 PowerdDesigner如何操作
1) 首先,需要为ORDER_ID列建立一个反向键索引。打开T_ORDER的Table Properties的窗口,切换到Indexes页,新建一个名为IDX_ORDER_ID的索引。填写完索引的名称后,双击这个索引,弹出Index Properties窗口,在这个窗口的Columns中选择ORDER_ID列。然后,切换到Options页,按图 7的方式将其设置为反向键索引。
图 7 设置反向键索引
2) 显式指定主键PK_ORDER使用这个索引。在Table Properties窗口中切换到Keys页,默认情况下,PowerDesigner为T_ORDER所指定的主键名为Key1,我们将其更名为PK_ORDER,双击这个主键,弹出Key Properties窗口,切换到Options页,按图 8的方式为PK_ORDER指定IDX_ORDER_ID。
图 8 为主键指定特定的索引
不可否认PowerDesigner确实是目前业界最强大易用的数据库设计工具,但很遗憾,当我们为表主键指定一个索引时,其产生的语句在顺序上有问题:即创建主键的语句位于创建索引语句之前:
create table T_ORDER (…);alter table T_ORDER add constraint PK_T_ORDER primary key (ORDER_ID) using index IDX_ORDER_ID;create unique index IDX_ORDER_ID on T_ORDER ( ORDER_ID ASC) reverse;
我们可以通过对PowerDesigner生成SQL语句的设置进行调整,先生成创建表和索引的SQL语句,再创建为表添加主键和外键的SQL语句来达到曲线救国的目的,请看下一步。
3)通过菜单Database->Generate Database...调出Database Configuration窗口,切换到Keys&Indexes页,按图 9设置:
图 9 设置生成键和索引SQL的选项
这里,我们将Primary Keys和Foreign keys的选项都取消,而将Indexes勾选,以达到只生成表的索引SQL语句的目的。
点击“确定”后,生成创建数据库表及其索引的SQL语句,运行该SQL创建数据库后,再按图 10设置生成为表添加主键和外键的SQL语句:
图 10 生成创建表主键和外键的SQL语句
除此设置外,还必须切换到Tables & Views页下,取消所有选项,避免重新生成创建表的语句。
3、将子表的外键列的索引改为压缩型
3.1 压缩型索引的原理和用途
在前面的例子中,由于一条订单会对应多条订单条目,所以T_ORDER_ITEM的ORDER_ID字段总会出现重复的值,如:
ITEM_ID ORDER_ID ITEM COUNT
1 100 101 1
2 100 104 2
3 100 201 3
4 200 301 2
5 200 401 1
6 200 205 3
在ORDER_ID列上创建一个普通未压缩的B-Tree索引,则索引数据的物理上的存储形式如下:
图 11 未进行压缩的索引存储
ORDER_ID的重复值在索引块中重复出现,这样不但增加了存储空间的需求,而且因为查询时需要读取更多的索引数据块,所以查询性能也会降低=。让我们来看一下经过压缩后索引数据的存储方式:
图 12 进行压缩的索引存储
压缩型的索引消除了重复的索引值,将相同索引列值所关联的ROWID存储在一起。这样,不但节省了存储空间,查询效率也提高了,真可谓两全齐美了。
对象T_ORDER和T_ORDER_ITEM这样的主从表进行查询时,一般情况下,我们都必须通过外键查询出子表所有关联的记录,所以在子表的外键上建立压缩型的索引是非常适合的。
3.2 压缩型索引的SQL语句
创建压缩型索引的SQL语句非常简单,在T_ORDER_ITEM的ORDER_ID上创建压缩型索引的SQL如下所示:
create index IDX_ORDER_ITEM_ORDER_ID on T_ORDER_ITEM ( ORDER_ID ASC) compress;
需要在创建索引的语句后附上compress关键字就可以了。
3.3 PowerDesigner如何创建压缩型索引
1) 打开T_ORDER_ITEM表的Table Properties的窗口,切换到Indexes页,为ORDER_ID列创建一个名为IDX_ORDER_ITEM_ORDER_ID的索引。
2) 双击IDX_ORDER_ITEM_ORDER_ID弹出Index Properties窗口,切换到Options页,按图 13将索引设置为压缩型:
图 13 将索引指定为压缩型
4、建立满足需求的复合键索引
设计人员希望通过T_ORDER表上的IDX_ORDER_COMPOSITE复合索引满足以下两种组合条件的查询:
・CLIENT + ORDER_DATE + IS_SHIPPED
・ORDER_DATE + IS_SHIPPED
为方便阐述,我们特地将IDX_ORDER_COMPOSITE的创建SQL语句再次列出:
create index IDX_ORDER_COMPOSITE on T_ORDER ( CLIENT ASC, ORDER_DATE ASC, IS_SHIPPED ASC);
事实上,在CLIENT + ORDER_DATE + IS_SHIPPED 三列上所执行的复合条件查询会应用到这个索引,而在ORDER_DATE + IS_SHIPPED列上所执行的复合查询不会使用这个索引,因而将导致一个全表扫描的操作。
可以用许多工具来了解查询语句的执行计划,通过SET AUTOTRACE ON来查询以上两个复合查询的执行计划:
打开SQL/Plus,输入以下的语句:
SQL>set autotrace on
SQL>select * from t_order where CLIENT = '1' and ORDER_DATE='1' and IS_SHIPPED='1';
分析得到的执行计划为:
SELECT STATEMENT ptimizer=CHOOSETABLE ACCESS (BY INDEX ROWID) OF 'T_ORDER' INDEX (RANGE SCAN) OF 'IDX_ORDER_COMPOSITE' (NON-UNIQUE)
可见Oracle先利用IDX_ORDER_COMPOSITE得到满足条件的记录ROWID,再通过ROWID返回记录。
而下面查询语句:
SQL>select * from t_order where ORDER_DATE='1' and IS_SHIPPED='1'
的执行计划则为:
SELECT STATEMENT ptimizer=CHOOSE TABLE ACCESS (FULL) OF 'T_ORDER'
很明显,Oracle在T_ORDER表上执行了一个全表扫描的操作,没有用到IDX_ORDER_COMPOSITE索引。
对复合列索引,我们得出这个结论:
假设在COL_1,COL_2,…,COL_n这些列上建立了一个复合索引:
create index IDX _COMPOSITE on TABLE1
{
COL_1,
COL_2,
…,
COL_n
}
则只有WHERE语句上包含COL_1(复合索引的第一个字段)的查询才会使用这个复合索引,而未包含COL_1的查询则不会使用这个复合索引。
回到我们的例子,如何建立满足CLIENT + ORDER_DATE + IS_SHIPPED和ORDER_DATE + IS_SHIPPED两种查询的索引呢?
考虑到IS_SHIPPED列基数很小,只有两个可能的值:0,1。在这种情况下,有两种方案:第一,分别为CLIENT + ORDER_DATE + IS_SHIPPED和ORDER_DATE + IS_SHIPPED建立一个复合索引;第二,分别在CLIENT和ORDER_DATE列上建立一个索引,而IS_SHIPEED列不建立索引。
第一种方案的查询效率最快,但因为CLIENT和ORDER_DATE在索引中会重复出现两次,占用较大的存储空间。第二种方案CLIENT和ORDER_DATE不会在索引存储出现两次,较为节省空间,查询效率比之于第一种方案会稍低一些,但影响不大。
我们采用第二种方案为CLIENT和ORDER_DATE分别创建索引IDX_CLIENT和IDX_ORDER_DATE,组合查询条件为CLIENT + ORDER_DATE + IS_SHIPPED时的执行计划为:
SELECT STATEMENT ptimizer=CHOOSE TABLE ACCESS (BY INDEX ROWID) OF 'T_ORDER' AND-EQUAL INDEX (RANGE SCAN) OF 'IDX_CLIENT' (NON-UNIQUE) INDEX (RANGE SCAN) OF 'IDX_ORDER_DATE' (NON-UNIQUE)
而组合条件为ORDER_DATE + IS_SHIPPED时的执行计划为:
SELECT STATEMENT ptimizer=CHOOSE TABLE ACCESS (BY INDEX ROWID) OF 'T_ORDER' INDEX (RANGE SCAN) OF 'IDX_ORDER_DATE' (NON-UNIQUE)
通过这样的改造,我们得到了一个满足两种组合查询的执行计划。
总结
贯穿本文的订单主从表实例结构上很简单,但是其粗糙的设计包含了许多问题,这也是许多对Oracle物理存储结构没有很好理解的数据库设计师容易忽视的地方。
在一般情况下,这样的设计并不会导致严重系统的性能问题,但是精益求精是每一位优秀软件设计师的品质,此外,对于设计师,一定要清楚这样一条规律:对于等质的性能提升,在编码层面往往需要比设计层面付出更多的艰辛。
在Oracle中提高数据库的性能需要考虑的问题,注意的误区还很多,本文涵盖是一些最常见的问题。下面,我们将提高数据库操作性能方法及一些误区作个小结:
・对于大表,可以考虑创建分区表,分区表有范围分区、散列分区、列表分区和散列分区几种,通过它可以达到化大表为小表的目的。
・考虑适量的数据冗余,如一个业务表有一个审批状态,审批需要经过多步,每一步对应审批表的一条记录,最后审批的那条记录决定了业务的状态。我们大可在业务表中存放一个审批状态的标志,以取消每次需要通过关联审批表获取业务审批状态的复杂的关联表查询。
・不要做太多的关联表查询,一些几乎不发生数据变动的表码表,如性别,学历,婚姻状态等表码表,可以考虑在应用程序启动时一次性地下载到应用程序的内存中缓存起来,在从数据库获取结果集后,再由程序利用这些缓存的表码表数据来翻译这些表码字段,而不要在数据库中通过表间的关联查询方式来翻译这些字段。
・常看到一些令我瞠目的设计:在需要进行频繁DML(INSERT,UPDATE,DELETE)操作的表的某些基数低的字段(如性别,婚姻状态)上创建位图索引。位图索引是好东西,但它是有使用范围的,在OLTP系统中,需要进行频繁DML操作的表中不应该出现位图索引,位图索引只适用于几乎不进行DML操作,只进行查询的DSS系统中。此外,聚簇和索引组织表也都更适合DSS系统,而非O
篇5:oracle里的常用命令数据库教程
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 'c:/oracle/oradata/oradb/redo01.log'
sql>to 'c:/oracle/oradata/redo01.log';
6.drop online redo log groups
sql>alter database drop logfile group 3;
7.drop online redo log members
sql>alter database drop logfile member 'c:/oracle/oradata/redo01.log';
8.clearing online redo log files
sql>alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
9.using logminer analyzing redo logfiles
a. in the init.ora specify utl_file_dir = ' '
b. sql>execute dbms_logmnr_d.build('oradb.ora','c:\\oracle\\oradb\\log');
c. sql>execute dbms_logmnr_add_logfile('c:\\oracle\\oradata\\oradb\\redo01.log',
sql>dbms_logmnr.new);
d. sql>execute dbms_logmnr.add_logfile('c:\\oracle\\oradata\\oradb\\redo02.log',
sql>dbms_logmnr.addfile);
e. sql>execute dbms_logmnr.start_logmnr(dictfilename=>'c:\\oracle\\oradb\\log\\oradb.ora');
f. sql>select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters
sql>v$logmnr_logs);
g. sql>execute dbms_logmnr.end_logmnr;
第二章:表空间管理
1.create tablespaces
sql>create tablespace tablespace_name datafile 'c:\\oracle\\oradata\\file1.dbf' size 100m,
sql>'c:\\oracle\\oradata\\file2.dbf' size 100m minimum extent 550k [logging/nologging]
sql>default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql>[online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql>create tablespace user_data datafile 'c:\\oracle\\oradata\\user_data01.dbf'
sql>size 500m extent management local uniform. size 10m;
3.temporary tablespace
sql>create temporary tablespace temp tempfile 'c:\\oracle\\oradata\\temp01.dbf'
sql>size 500m extent management local uniform. size 10m;
4.change the storage setting
sql>alter tablespace app_data minimum extent 2m;
sql>alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or online
sql>alter tablespace app_data offline;
sql>alter tablespace app_data online;
6.read_only tablespace
sql>alter tablespace app_data read only|write;
7.droping tablespace
sql>drop tablespace app_data including contents;
8.enableing automatic extension of data files
sql>alter tablespace app_data add datafile 'c:\\oracle\\oradata\\app_data01.dbf' size 200m
sql>autoextend on next 10m maxsize 500m;
9.change the size fo data files manually
sql>alter database datafile 'c:\\oracle\\oradata\\app_data.dbf' resize 200m;
10.Moving data files: alter tablespace
sql>alter tablespace app_data rename datafile 'c:\\oracle\\oradata\\app_data.dbf'
sql>to 'c:\\oracle\\app_data.dbf';
11.moving data files:alter database
sql>alter database rename file 'c:\\oracle\\oradata\\app_data.dbf'
sql>to 'c:\\oracle\\app_data.dbf';
第三章:表
1.create a table
sql>create table table_name (column datatype,column datatype]....)
sql>tablespace tablespace_name [pctfree integer] [pctused integer]
sql>[initrans integer] [maxtrans integer]
sql>storage(initial 200k next 200k pctincrease 0 maxextents 50)
sql>[logging|nologging] [cache|nocache]
2.copy an existing table
sql>create table table_name [logging|nologging] as subquery
3.create temporary table
sql>create global temporary table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows
4.pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql>alter table table_name pctfree=30 pctused=50 storage(next 500k
sql>minextents 2 maxextents 100);
6.manually allocating extents
sql>alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
7.move tablespace
sql>alter table employee move tablespace users;
8.deallocate of unused space
sql>alter table table_name deallocate unused [keep integer]
9.truncate a table
sql>truncate table table_name;
10.drop a table
sql>drop table table_name [cascade constraints];
11.drop a column
sql>alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
12.mark a column as unused
sql>alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
data_dictionary : dba_unused_col_tabs
第四章:索引
1.creating function-based indexes
sql>create index summit.item_quantity on summit.item(quantity-quantity_shipped);
2.create a B-tree index
sql>create [unique] index index_name on table_name(column,.. asc/desc) tablespace
sql>tablespace_name [pctfree integer] [initrans integer] [maxtrans integer]
sql>[logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql>maxextents 50);
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows
4.creating reverse key indexes
sql>create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k
sql>next 200k pctincrease 0 maxextents 50) tablespace indx;
5.create bitmap index
sql>create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k
sql>pctincrease 0 maxextents 50) tablespace indx;
6.change storage parameter of index
sql>alter index xay_id storage (next 400k maxextents 100);
7.allocating index space
sql>alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf');
8.alter index xay_id deallocate unused;
第五章:约束
1.define constraints as immediate or deferred
sql>alter session set constraint[s] = immediate/deferred/default;
set constraint[s] constraint_name/all immediate/deferred;
2. sql>drop table table_name cascade constraints
sql>drop tablespace tablespace_name including contents cascade constraints
3. define constraints while create a table
sql>create table xay(id number(7) constraint xay_id primary key deferrable
sql>using index storage(initial 100k next 100k) tablespace indx);
primary key/unique/references table(column)/check
4.enable constraints
sql>alter table xay enable novalidate constraint xay_id;
5.enable constraints
sql>alter table xay enable validate constraint xay_id;
第六章:LOAD数据
1.loading data using direct_load insert
sql>insert /*+append */ into emp nologging
sql>select * from emp_old;
2.parallel direct-load insert
sql>alter session enable parallel dml;
sql>insert /*+parallel(emp,2) */ into emp nologging
sql>select * from emp_old;
3.using sql*loader
sql>sqlldr scott/tiger \\
sql>control = ulcase6.ctl \\
sql>log = ulcase6.log direct=true
第七章:reorganizing data
1.using expoty
$exp scott/tiger tables(dept,emp) file=c:\\emp.dmp log=exp.log compress=n direct=y
2.using import
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y
3.transporting a tablespace
sql>alter tablespace sales_ts read only;
$exp sys/.. file=xay.dmp transport_tablespace=y tablespace=sales_ts
triggers=n constraints=n
$copy datafile
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2
/sles02.dbf)
sql>alter tablespace sales_ts read write;
4.checking transport set
sql>DBMS_tts.transport_set_check(ts_list =>'sales_ts' ..,incl_constraints=>true);
在表transport_set_violations 中查看
sql>dbms_tts.isselfcontained 为true 是, 表示自包含
第八章: managing password security and resources
1.controlling account lock and password
sql>alter user juncky identified by oracle account unlock;
2.user_provided password function
sql>function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql>create profile grace_5 limit failed_login_attempts 3
sql>password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql>password_grace_time 5;
4.altering a profile
sql>alter profile default failed_login_attempts 3
sql>password_life_time 60 password_grace_time 10;
5.drop a profile
sql>drop profile grace_5 [cascade];
6.create a profile : resource limit
sql>create profile developer_prof limit sessions_per_user 2
sql>cpu_per_session 10000 idle_time 60 connect_time 480;
7. view =>resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql>alter system set resource_limit=true;
第九章:Managing users
1.create a user: database authentication
sql>create user juncky identified by oracle default tablespace users
sql>temporary tablespace temp quota 10m on data password expire
sql>[account lock|unlock] [profile profilename|default];
2.change user quota on tablespace
sql>alter user juncky quota 0 on users;
3.drop a user
sql>drop user juncky [cascade];
4. monitor user
view: dba_users , dba_ts_quotas
第十章:managing privileges
1.system privileges: view =>system_privilege_map ,dba_sys_privs,session_privs
2.grant system privilege
sql>grant create session,create table to managers;
sql>grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;
3.sysdba and sysoper privileges:
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,
alter tablespace begin/end backup,recover database
alter database archivelog,restricted session
sysdba: sysoper privileges with admin option,create database,recover database until
4.password file members: view:=>v$pwfile_users
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema
6.revoke system privilege
sql>revoke create table from karen;
sql>revoke create session from scott;
7.grant object privilege
sql>grant execute on dbms_pipe to public;
sql>grant update(first_name,salary) on employee to karen with grant option;
8.display object privilege : view =>dba_tab_privs, dba_col_privs
9.revoke object privilege
sql>revoke execute on dbms_pipe from scott [cascade constraints];
10.audit record view :=>sys.aud$
11. protecting the audit trail
sql>audit delete on sys.aud$ by access;
12.statement auditing
sql>audit user;
13.privilege auditing
sql>audit select any table by summit by access;
14.schema object auditing
sql>audit lock on summit.employee by access whenever successful;
15.view audit option : view=>all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts
16.view audit result: view=>dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement
第十一章: manager role
1.create roles
sql>create role sales_clerk;
sql>create role hr_clerk identified by bonus;
sql>create role hr_manager identified externally;
2.modify role
sql>alter role sales_clerk identified by commission;
sql>alter role hr_clerk identified externally;
sql>alter role hr_manager not identified;
3.assigning roles
sql>grant sales_clerk to scott;
sql>grant hr_clerk to hr_manager;
sql>grant hr_manager to scott with admin option;
4.establish default role
sql>alter user scott default role hr_clerk,sales_clerk;
sql>alter user scott default role all;
sql>alter user scott default role all except hr_clerk;
sql>alter user scott default role none;
5.enable and disable roles
sql>set role hr_clerk;
sql>set role sales_clerk identified by commission;
sql>set role all except sales_clerk;
sql>set role none;
6.remove role from user
sql>revoke sales_clerk from scott;
sql>revoke hr_manager from public;
7.remove role
sql>drop role hr_manager;
8.display role information
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles
第十二章: BACKUP and RECOVERY
1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size
3. Monitoring Parallel Rollback
>v$fast_start_servers , v$fast_start_transactions
4.perform. a closed database backup (noarchivelog)
>shutdown immediate
>cp files /backup/
>startup
5.restore to a different location
>connect system/manager as sysdba
>startup mount
>alter database rename file '/disk1/../user.dbf' to '/disk2/../user.dbf';
>alter database open;
6.recover syntax
--recover a mounted database
>recover database;
>recover datafile '/disk1/data/df2.dbf';
>alter database recover database;
--recover an opened database
>recover tablespace user_data;
>recover datafile 2;
>alter database recover datafile 2;
7.how to apply redo log files automatically
>set autorecovery on
>recover automatic datafile 4;
8.complete recovery:
--method 1(mounted databae)
>copy c:\\backup\\user.dbf c:\\oradata\\user.dbf
>startup mount
>recover datafile 'c:\\oradata\\user.dbf;
>alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
>copy c:\\backup\\user.dbf c:\\oradata\\user.dbf (alter tablespace offline)
>recover datafile 'c:\\oradata\\user.dbf' or
>recover tablespace user_data;
>alter database datafile 'c:\\oradata\\user.dbf' online or
>alter tablespace user_data online;
--method 3(opened database,initially closed not system or rollback datafile)
>startup mount
>alter database datafile 'c:\\oradata\\user.dbf' offline;
>alter database open
>copy c:\\backup\\user.dbf d:\\oradata\\user.dbf
>alter database rename file 'c:\\oradata\\user.dbf' to 'd:\\oradata\\user.dbf'
>recover datafile 'e:\\oradata\\user.dbf' or recover tablespace user_data;
>alter tablespace user_data online;
--method 4(loss of data file with no backup and have all archive log)
>alter tablespace user_data offline immediate;
>alter database create datafile 'd:\\oradata\\user.dbf' as 'c:\\oradata\\user.dbf''
>recover tablespace user_data;
>alter tablespace user_data online
5.perform. an open database backup
>alter tablespace user_data begin backup;
>copy files /backup/
>alter database datafile '/c:/../data.dbf' end backup;
>alter system switch logfile;
6.backup a control file
>alter database backup controlfile to 'control1.bkp';
>alter database backup controlfile to trace;
7.recovery (noarchivelog mode)
>shutdown abort
>cp files
>startup
8.recovery of file in backup mode
>alter database datafile 2 end backup;
9.clearing redo log file
>alter database clear unarchived logfile group 1;
>alter database clear unarchived logfile group 1 unrecoverable datafile;
10.redo log recovery
>alter database add logfile group 3 'c:\\oradata\\redo03.log' size 1000k;
>alter database drop logfile group 1;
>alter database open;
or >cp c:\\oradata\\redo02.log' c:\\oradata\\redo01.log
>alter database clear logfile 'c:\\oradata\\log01.log';
篇6:ORACLE NUMBER类型详解数据库教程
1>.NUMBER类型细讲:
Oracle number datatype 语法:NUMBER[(precision [, scale])]
简称:precision -->p
scale -->s
NUMBER(p, s)
范围: 1 <= p <=38, -84 <= s <= 127
保存数据范围:-1.0e-130 <= number value < 1.0e+126
保存在机器内部的范围: 1 ~ 22 bytes
有效为:从左边第一个不为0的数算起的位数,
s的情况:
s >0
精确到小数点右边s位,并四舍五入。然后检验有效位是否 <= p。
s < 0
精确到小数点左边s位,并四舍五入。然后检验有效位是否 <= p + s。
s = 0
此时NUMBER表示整数。
eg:
Actual Data Specified As Stored As
----------------------------------------
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位为5, 5 >4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位为4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位为5+2 >6)
1234.9876 NUMBER(6) 1235 (s没有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位为8 >7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位为10 >9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位为5 >4)
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
基于Oracle Spatial的时态空间数据库设计数据库教程
- Oracle数据库优化策略总结2024-10-08
- 监控Oracle数据库的常用shell脚本数据库2023-12-31
- 全检索的应用数据库教程2023-04-20
- PL/SQL Developer数据库教程2022-12-11
- 右外连接数据库教程2022-12-11
- Oracle数据库的几种启动和关闭方式2024-03-28
- Mysql和Oracle数据库中的分页查询2022-12-11
- PL/SQL流程控制数据库教程2023-04-26
- 远程管理sqlserver的注册方法数据库教程2022-12-25
- 逻辑备份与恢复实战数据库教程2023-02-10