Oracle体系结构2((通用8篇))由网友“很穷小杨”投稿提供,下面是小编整理过的Oracle体系结构2,欢迎您能喜欢,也请多多分享。
篇1:Oracle体系结构2
Oracle实例
当把一个关闭的数据库手动启动并装载和打开,从而使数据库变得有效时,分别经历的阶段如下:
l启动实例而不装载数据库
l数据库装载
l数据库打开
1.启动实例,此时执行如下操作:
l从OS指定位置处检索服务器参数文件,如果没找到则通过启动命令中是使用SPFILE还是PFILE替代默认的文件使用该文本初始化参数文件
l从初始化文件中读取初始化参数
l基于初始化参数值分配SGA
l启动Oracle后台进程
l打开警告日志和跟踪文件,并写入警告日志文件
此阶段数据库与实例没有关联,可以执行数据库创建、备份和恢复的等特定任务,
2.数据库装载,其特征如下:
l获取初始化参数文件中指定的控制文件参数(CONTROL_FILES)的值,打开控制文件并从其中找到数据文件和联机重做日志文件的名字
l在一个已装载的数据库中,数据库是关闭的,仅仅DBA能够访问,管理员可以利用本特点在需要完成特定任务时保持数据库装载状态
3.数据库打开,打开后的数据库是可访问的,执行如下操作:
l打开除撤销表空间外其它表空间中的数据文件
l获取撤销表空间
l打开联机重做日志文件
数据库关闭
当把一个打开的数据库手动关闭,使其从有效状态进入无效状态从而执行一些维护任务时,分
别经历的阶段如下:
l数据库关闭
l数据库卸载
l数据库实例关闭
1.关闭模式
有4种关闭模式,其行为是不同的,如下表:
行为
ABORD
IMMEDIATE
TRANSCATIONAL
NORMAL
允许新用户连接?
NO
NO
NO
NO
等待直到当前会话结束?
NO
NO
NO
YES
等待直到事务会话结束?
NO
NO
YES
YES
执行一个检查点并关闭文件?
NO
YES
YES
YES
可能的关闭语句分别如下:
lSHUTDOWN ABORD
用于紧急情形,例如其它的关闭方式无法成功关闭时。强制模式的关闭速度最快,但再重新打开数据库时速度也是最慢的,因为要支持一个恢复过程以确保数据的一致性。
1.关闭模式
可能的关闭语句分别如下(续):
lSHUTDOWN IMMEDIATE
立即模式的关闭速度仅次于ABORD,此时Oracle会中断任何正在执行的SQL语句并且将连接的用户断开;同时活动事务也被中断,未提交的修改被置成回滚。
lSHUTDOWN TRANSACTIONAL
事务模式防止新事物的启动,但会等待当前所有事务执行完成。自然地,关闭时间依赖于当活动前事务执行的时间
lSHUTDOWN NORMAL
正常模式是默认的关闭模式,会等待所有已连接用户断开连接后关闭。
2.数据库关闭三阶段
(1).关闭阶段:
数据库关闭过程中隐含的操作取决于数据库是正常关闭还是非正常关闭:
1).正常关闭
即没有使用ABORD,此时Oracle会把SGA中的数据写入到数据文件和联机重做日志文件中,接着会关闭联机数据文件和重做日志文件。所有的脱机表空间中的脱机数据文件已经被关闭,如果此时再重新打开数据库,则脱机表空间仍然会保持脱机状态。
在这个阶段,数据库已经被关闭并且不能正常被访问,而控制文件依然还是保持被打开状态。
2.数据库关闭三阶段
(1).关闭阶段(续):
1).非正常关闭
即使用了ABORD或数据库发生了非正常的终止,此时当前打开的数据库实例会被关闭并且会立即关闭数据库。SGA中的缓冲数据不会被写入到数据文件和联机重做日志文件中。当接下来重新打开数据库时,Oracle会自动地先恢复该实例。
(2).卸载阶段
在数据库关闭以后执行本阶段,此阶段Oracle会从实例中卸载数据库。数据库卸载后,Oracle会关闭控制文件,但是实例仍然会保留在内存中。
2.数据库关闭三阶段
(3).实例关闭阶段
这是数据库关闭的最后一个阶段,当数据库实例关闭以后,内存中的SGA会被清除,后台进程也会被停止。
检查点
检查点是在协调数据库关闭、实例恢复和常规操作一致性方面非常重要的一个循环处理机制。检查点有两层相关的含义:
l检查点是一个指示检查点位置的数据结构,当实例恢复时它是在重做日志流中的SCN(系统该变号)
l当将数据库缓冲区中的数据写入到磁盘时检查点是一种写事件
1.检查点的目的包括:
l缩短因介质或实例故障恢复所需要的时间
l确保缓冲区的数据规则的写入到硬盘
l确保在一致性的关闭时将提交的数据写入到磁盘
2.Oracle实例何时初始化检查点
检查点进程(CKPT)用来将检查点写入到数据文件头部和控制文件中,一般包括以下几种情形:
l线程检查点
在某个特点的目标任务前,数据库在一个特定的线程中将所有被重做日志修改的缓冲区写入到磁盘中。一组数据库中所有实例检查点(检查点集合)称为数据库检查点,数据库检查点会在以下几种情况下发生:
u并发的数据库关闭
u联机重做日志切换
uALTER SYSTEM CHECKPOINT语句执行时
uALTER DATABASE BACKUP BEGIN语句执行时
2.Oracle实例何时初始化检查点(续)
l表空间和数据文件检查点
表空间检查点是一组为表空间中每一个数据文件服务的检查点集合,将表空间设置为脱机、只读以及收缩数据文件或者执行ALTER DATABASE BACKUP BEGIN语句时会产生
l增量检查点
增量检查点是一类线程检查点,当联机重做日志发生交换时使用增量检查点来部分的消除对大数据块的写入。数据库写入进程(DBWn)至少每3秒钟会检查一次其是否要执行数据写入工作,当DBWn写入脏数据,它将提取检查点的位置,从而产生一个CKPT将检查点的位置写入到控制文件,但不会写入到数据文件的头部。
实例恢复
1.实例恢复的目的
当时实例失败时,实例恢复能确保数据库保持在一个一致性状态,因为无论Oracle数据库如何管理数据库的变化,都可能发生数据库文件不一致的情况。
重做日志线程(实例生成的重做日志)是实例产生的所有发生了变化的记录。单一实例的数据库具有唯一的一个重做日志线程。
事务提交时,日志写入进程(LGWR)将保留在内存的重做日志实体和事务的系统改变号(SCN)写入到联机重做日志中,然而当DBWn工作时,DBWn都会将修改了的数据块写入到数据文件中,因此未提交的修改会临时保存在数据文件中而已经提交的修改却不再保存在数据文件中。
1.实例恢复的目的(续)
当由于SHUTDWON ABORD或其它原因导致打开的数据库发生实例失败时,会发生如下情况:
l提交的数据块仅仅写入到的联机重做日志而没有写入到数据文件中,这些变化必须要应用到数据库中,即写入到数据文件中,否则数据不一致
l事务失败时,数据文件中可能包含未提交事务的数据,而这种改变应该被回滚以保持数据库的一致性
实例恢复就是用联机重做日志文件来同步当前的联机数据文件,以确保它们是一致的。
2.何时会执行实例恢复
当数据库实例打开为读/写模式时,控制文件中的重做日志线程被标记为打开;如果数据库被关闭时是一致(日志文件和数据文件的一致)的,则日志线程被标记为关闭。实例恢复就是依据日志线程的状态的。如果日志线程的标记是打开的,但是却没有活动实例的线程队列来与日志线程通讯,则需要进行实例恢复。
以下两种情况下,Oracle会自动恢复实例:
l单一实例或集群实例数据库中实例失败后的第一次打开
l集群实例环境中,部分实例失败
l
3.实例恢复中检查点的重要性
实例恢复使用检查点来确定那些修改要应用到数据文件中去。如果已提交修改的SCN小于检查点SCN,则检查点的位置将被写入到数据文件中。
在实例恢复期间,数据库必须将检查点位置和重做日志线程之间的修改应用到数据文件中。部分改变可能已经写入到数据文件中,然而仅仅那些系统该变号小于检查点位置的会被写入磁盘。
4.实例恢复阶段
1).缓存恢复(或称为前滚阶段)
首先是缓存恢复和前滚(向前滚动)阶段,此时会将联机重做日中记录的所有改变重新应用到数据文件中。由于需要回滚的数据也被记录在联机重做日中,因此向前滚动也会产生相应的回滚段。
前滚会将联机重做日中所有记录了要求回滚的数据一直向前回滚直到前面某个时刻的状态。完成前滚后,数据文件中就包含了所有联机重做日中已提交修改的数据,数据文件中也就不再包含联机重做日或数据文件中没有提交的数据了。
2).事务恢复(又称为回滚)阶段
前滚完成后,任何未提交的修改都会被撤销。Oracle将SCN小于检查SCN的已提交修改写入磁盘。针对实例失败前写入到数据文件中的未提交修改,Oracle会申请撤销块用来执行回滚操作。
下图说明了前滚和回滚两个阶段。
参数文件
启动实例可以使用服务器参数文件(推荐)也可以使用传统的文本初始化文件。这些文件中包含的都是一系列的配置参数。
1.初始化参数
不同的环境中,Oracle都提供了很多初始化参数,而大部分参数无需修改,只有很少部分参数需要进行设置。
1).初始化参数的功能分组
l 文件和目录名字的参数
l 进程的限定数、数据库资源或者数据库自身的参数
l 设定容量大小的参数,如SGA的大小参数
2).基本及高级参数
初始化参数分为基本参数和高级参数,大约30个左右。基本参数包括数据库的名字、控制文件的位置、数据库块大小、撤销表空间等。在极少数情况下,需要数据库专家来调整高级参数以获取更好的数据库性能以满足一些独特的需求。
2.服务器参数文件
即数据库管理的初始化文件,具有如下特性:
l必须在数据库服务器主机上,且数据库只有一个服务器参数文件
l只能被数据库服务器读取,而不能被客户端读取
l存储在数据库服务器主机上的服务器参数文件是持久的。对参数的修改,不但对当前实例有效,而且数据库关闭和重新启动后依然有效
使用服务器参数文件能够消除需要维护多个本地文本初始化参数文件的问题。
3.文本初始化参数文件
即传统的初始化文件,是包含了一些列初始化参数的文本文件,特点如下:
l数据库关闭或启动时,文本初始化参数文件必须驻留在连接到数据库的那台客户端的机器上
l是文本格式而非二进制格式的
lOracle只能读而不能写该文件,对参数的修改必须手工进行
l使用ALTER SYSTEM修改参数只能在当前实例中有效。如果想要对参数的修改在重新启动数据库后也有效,必须要手工修改该文件然后重启数据库
下图是使用多个文本初始化文件的例图:
4. 初始化参数的修改
参数又可分为静态参数和动态参数,其特征如下:
特征
静态
动态
需要修改参数文件(文本和服务器)?
YES
NO
修改生效前需要重新启动实例?
YES
NO
在《Oracle数据库参考》中初始化参数项描述为“可变”?
NO
NO
修改只针对数据库和实例
YES
NO
DB_BLOCK_SIZE、DB_NAME、COMPATIBLE是静态参数。动态参数又分为会话级的和系统级的两组,回话级的仅仅在当前会话中有效(如NLS_DATE_FORMAT),系统级的不仅在当前会话中而且在整个数据库中都是有效的(如MEMORY_TARGET)。
4. 初始化参数的修改
可以使用ALTER SYSTEM SET语句来设置系统级参数所设置的范围:
lSCOPE=MEMORY
参数的改变仅仅影响当前实例,数据库重新启动后失效
lSCOPE=SPFILE
参数的改变写入到服务器参数文件,并且在当前实例中生效,必须重启数据库方能生效
lSCOPE=BOTH
是MEMORY和SPFILE的结合体
诊断文件
Oracle使用故障诊断部件来预防、监测、诊断和解析数据库的问题,这些问题一般包括代码的bug、元数据损坏或客户数据损坏。故障诊断部件的目的包括:
l 预先侦测问题
l 当侦测到问题时,减小损坏范围并中断数据库服务
l 缩短问题诊断和解决的时间
l 简化Oracle技术支持和客户之间的交互过程
1.自动诊断信息库
ADR(Auto Diagnostic Repository)是一个基于文件的资料库,用来存储跟踪文件、警告文件和数据库健康监测报告等资料,其特征如下:
l具有统一的目录结构
l具有一致的诊断数据格式
l提供统一的工具集
这些特征能够保证Oracle技术支持与客户进行高效的交互。ADR是在数据库之外的,因此当物理数据库失效后Oracle还能访问管理ADR。数据库创建前可以创建ADR。
1).工作机制
ADR采用问题预先跟踪机制,而当危险错误发生时会产生内部错误。ADR跟踪每个问题时都有一个问题键(文本描述的)。当同一个问题发生多次时,ADR对每一次问题的发生都创建一个带时间戳的事件,事件具有事件ID(数字型)。事件发生时,ADR将事件警告发送给OEM。对问题的诊断和解决一般都是由事件警告入手的。
由于一个危险错误多半表现在为在短时间内发生多次,即具有泛滥性。如果ADR找到了事件的起始,就会申请使用灾害控制机制来控制事件的继续发生。事件泛滥控制会生成警告日志。ADR通过这种方式能够通知到管理员危险错误正在发生。
2).ADR结构
ADR base是ADR的根目录,ADR base可以包含多个ADR目录用来存放不同的诊断数据,如警告、核心数据、事件、跟踪信息和其它数据等。
预警日志
每个数据库都有预警日志,是xml格式的,包含的内容如下:
l内部错误(ORA-600)、块损坏错误(ORA-1578)和死锁(ORA-60)
l管理操作如DDL语句
lSQL*PLUS命令如STARTUP、SHUTDWON、ARCHIVE LOG、RECOVERY
l自动刷新物化视图时的错误
跟踪文件
跟踪文件是一个用来研究分析问题的管理员文件,
1.跟踪文件的类型
每个服务器进程和后台进程都会周期性的写一个相关的跟踪文件,其内部是进程的环境、状态、活跃性或者错误。
SQL跟踪也能灵活的创建跟踪文件,用来记录个性化的SQL语句执行信息。如果要跟踪客户标示、服务、模块、动作、会话、实例和数据库,则可以使用OEM或者DBMS_MONITER包。
转储(dump)是一类特殊的跟踪文件。鉴于跟踪往往是连续的输出,转储就是在某个时间点上对某个事件的诊断信息进行输出。当事件发生时,数据库中写入一个或多个转储至事件目录(专门创建的)。
2.跟踪文件的位置
ADR跟踪文件存储在跟踪目录下面,文件名是依赖平台的,扩展名是.trc。一般是后台进程跟踪文件名带有SID、后台进程名字和操作系统进程号,如mytest_reco_10355.trc。服务器进程跟踪文件名带有SID、“ora”字符串和操作系统进程号,如mytest_ora_10304.trc。
有时跟踪文件中有相应的跟踪映射文件( .trm )。 这些文件包含有关跟踪文件的结构信息,用于搜索和导航。
基本内存结构
1.SGA
一组共享内存结构,包含实例的控制信息和数据。可以为所有的服务器进程和后台进程所共享。
2.PGA
进程所专用的包含实例控制信息和数据的非共享内存区域。当一个进程启动时它创建一段PGA,因此其也是为某个服务
器或后台进程服务的,一组PGA构成总的PGA或者称为实例PGA。数据库PGA初始化参数是为实例PGA而非单个PGA所设置的。
3.UGA
UGA(用户全局区)是为用户会话相连的一段内存区域。
4.软件代码区
用来存储正在运行或者准备运行的代码的一部分内存,Oracle的代码存在软件代码区,是与用户程序完全不同的。
Oracle内存管理模式
1.自动内存管理(AMM)
设定实例内存的目标大小,实例依据PGA和SGA的实际需要自动分配和自动设定内存的大小。这是默认的内存管理方式
2.自动共享内存管理(ASMM)
这种内存的管理方式是部分的自动内存管理机制,通过设定SGA的目标大小,而对PGA的管理可以选择给PGA设置一个总的大小也可以选择个性化的方式来管理PGA。
3.手工内存管理
这种模式不用设置总的内存大小,而是逐一设置PGA和SGA实例的各个参数。
UGA
UGA是分配给会话变量的内存,包括登录信息以及其它数据库会话必须的信息。本质上UGA存储的是会话的状态。例如会话装载一个PL/SQL包
到内存中,则UGA包含包的状态,这些状态是包变量在某个特定时刻的一系列的值。当包中子程序改变了变量的值,则包的状态也会发生改变。默认情况下,包中变量会在会话的生命期内保持一个唯一的状态。
OLAP页池也存储在UGA,池管理OLAP的页(等价于数据块)。OLAP会话开始时分配页池、而会话结束时释放页池。
会话在其生命期内UGA必须是有效,因而在共享服务器连接时UGA不能放在PGA区域,其原因是PGA是分配给单个进程的。因为在共享服务器连接时UGA存在SGA而在专用服务器连接时放在PGA。
PGA
l分配给OS进程或线程的、且不可为其它OS进程或线程所共享因其进程专用性,故不能是在SGA中分配的
lPGA是一个内存堆,其中包含有专用或共享服务器进程所需的会话变量;服务器进程从PGA中分配内存结构
1.私有SQL区域
l保存解析后的SQL语句以及其它会话特定要求的信息
l服务器进程执行SQL语句或PL/SQL代码时,使用私有SQL区域干三件事:绑定变量值、查询执行的状态信息、查询执行工作区.执行完成后客户端可以使用一个游标指向私有SQL区域,如下图:
SGA
1.数据库高速缓冲区
l又称为高速缓存缓冲区,用来存储从数据文件的数据块中读取的数据的副本
l是最主要的内存地址,缓存管理器用来临时缓存当前或最近读取的数据块
l所有的连接用户均可访问本区域
Oracle使用高速缓存缓冲区来达到如下两个目的:
l优化物理I/O
l将经常被访问的块保存在缓存中,而将很少访问的块写入到磁盘
1.数据库高速缓冲区
(1).高速缓冲区的状态
l未使用状态:从未被使用或当前未使用的内存,最容易被数据库使用
l干净状态:早前用过且当前包含一个某个时间点上具有读一致性的数据块的内存;干净的含义是块中的数据是“干净”的以至于不需要检查点;数据库能保留当中的块并重新使用它
l脏状态:包含被修改过且还未写入到磁盘的数据的内存;脏状态的内存在重新使用前必须要设置检查点
每个缓冲区的访问模式都可能有两种:“保留”的和“自由”的。缓存中的缓冲区被“保留”以便用户会话能访问它。同一时刻不能有多个会话修改同一个“保留”缓冲区。
(2).高速缓冲区的模式
客户端请求数据时,Oracle从数据库缓冲区中获得缓存,模式包括:
l最近性模式:最近性模式又称为数据块模式,是指检索的数据是从高速缓冲区中检索的。如某个未提交的事务更新了两行数据,然后一个最近性模式化能从刚刚未提交的行中获取数据块。这种模式一般用来处理更新语句。
l一致性模式:从读一致性版本的数据块中检索数据,此模式也可以从撤消数据中读取数据。如某个未提交的事务更新了两行数据,当另外一个会话请求这两行数据时,数据块将使用撤消数据创建一个不包含未提交数据的读一致性数据版本块给该请求。通常,此模式是数据块检索采用的模式。
(3).高速缓冲区的I/O
先在内存中执行逻辑I/O,如果请求的缓存不再缓冲区,则执行一个物理I/O,从而从磁盘或闪存缓冲中获取还数据,然后再执行逻辑I/O.
l缓冲区写入器:DBWn定期将使用很少的或脏数据写入磁盘,情形有:
l服务器进程找不到干净的缓冲区用来装载准备新读入的数据时
l因实例开始恢复而必须预先提取检查点(存储在重做日志线程中)时
l表空间被设置成只读或者脱机时
l缓冲区读出器:当干净的或未使用的缓冲区数量很小时,数据库就必须从缓存缓冲区中移除一部分缓存。其算法取决于闪存缓存是否启用,如下描述:
l缓冲区读出器(续):
l闪存缓存禁用时:数据库重新使用每一个干净的缓存并用新数据覆盖它。如果对缓冲区的覆盖需要延迟,则数据库必须先从磁盘读出它
l闪存缓存启用时:DBWn能将干净缓存的主体写入到闪存缓存,并且允许在内存中对它进行重用。在主内存中,数据库将该缓存的头保存到一个LRU列表中用来跟踪和定位闪存缓存中的缓冲区主体。如果对缓冲区的覆盖需要延迟,则数据库可以从闪存缓存中而不是从磁盘读出它
当客户端进程请求缓存时,服务器进程在高速缓存缓冲区中搜索缓存,如果搜到缓存,则称为缓存命中,服务器进程的搜索顺序如下:
l在整个高速缓存缓冲区中搜索缓存,如果找到则对该缓存执行逻辑读
l在闪存缓存的LRU列表中搜索缓存头,如果存在,则对闪存缓存执行一个优化的物理读
l如果上述均未搜索到,则称为缓存未命中,将接着执行如下步骤:
当客户端进程请求缓存时(续):
l执行物理读从数据文件中将块读入内存
l执行逻辑读,再读入缓存
(4). 缓存池
缓存池是缓存的集合,数据库高速缓存缓冲区被划分为一个或多个缓冲池。包括以下几种可能:
l默认池(Default):该池是块通常缓冲的位置。 除非手动配置独立的缓存池,否则默认池是唯一的缓冲池。
l保存池(Keep):用于频繁访问的块,但是如果在默认池中空间缺乏时这些块会被收回。保留池的目的是将对象保存在内存中,从而降低I/O
l回收池(Recycle):循环使用的缓存池,用于访问率很低的块,用来防止这些块占用宝贵的内存资源
2.重做日志缓冲区
是一个循环的缓冲区,用来存放重做日志条目,重做日志条目中存储了用来重建、撤消或者DML/DDL语句对数据库所做的修改信息。数据库恢复就是使用重做日志条目来恢复数据文件的。
数据库从用户内存中拷贝重做日志条目到重做日志缓冲区中。重做日志条目在缓存中占据连续的顺序空间。LGWR(Log Writer)将重做日志缓冲区写入到磁盘上的联机重做日志文件(顺序写入)。
3.共享池
SGA保留的区,用来存储解析了的SQL、PL/SQL代码、系统参数和数据字典。数据库中的任何操作几乎都与共享池有关。
(1).库缓冲区
用来存储可执行的SQL或者PL/SQL代码。本区域包含SQL和PL/SQL区域、控制结构(如锁)、库缓存的句柄。在共享服务器结构下,还包括私有的SQL区域。
当SQL语句执行时,数据库试图重用以前执行过的代码,如果解析后的代码在库缓存中存在且能够被共享,则重用它,称为软解析或库缓存命中。否则,数据库重新构造一个可执行版本的应用代码,称为硬解析或者库缓存未命中。
1).共享SQL区域
数据库使用共享SQL区域处理SQL语句的第一次执行,本区域对所有用户均有效且包含语句解析树和执行计划。每个唯一的语句只有唯一的一个共享SQL区域。
2).私有SQL区域
每个会话发布一个SQL语句时均有一个私有SQL区域。如果多个用户发布的是相同的SQL语句,则它们的私有SQL区域均指向同一个共享SQL区域。
(2).数据字典缓冲区
用于存放数据库系统自身信息的缓冲区,如表、视图、结构、用户等。SQL语句解析期间,数据字典会被频繁的访问。
由于数据字典被访问的频率非常高,因此其中又设计了两种内存位置:
1).数据字典内存区:放的是数据库对象的信息,而且行缓存也能使用本区域
2).库内存区:将数据字典信息放在本缓冲区供所有服务器进程共享
4.大对象池
大对象池是一个可选的缓冲区,管理员可根据需要对其进行配置。大对象池还可以用来提供一个大的区域供数据库备份和恢复使用
5.Java池
Java池用来存储特定会话的Java代码和数据,是为JVM准备的,其中包括Java对象。
6.流池
流池存储缓存队列消息并且为Oracle流捕获进程或申请进程。流池是Oracle流专用的。如果没有特别指定,流池开始时大小是0,其大小的增长是根据Oracle流的需要动态增加的。
7.固定的SGA
固定的SGA是一种内部事务管理的区域,例如:
l后台进程需要经常访问的数据库和实例的常规信息
l进程之间的通讯信息,如锁的信息
固定的SGA是有Oracle数据库自身设定的并且不能手工修改。
客户端进程
l不同于Oracle后台进程和服务器进程,客户端进程不能直接对SGA进行读写,而是通过服务器进程来实现
l发起客户端集成的主机往往不是服务器主机
l连接:连接是客户端进程和实例间的一种物理通讯链路
l会话:会话是数据库实例内存中描述登录到数据库当前用户状态的逻辑实体
l一个用户可以拥有多个会话,某个会话中的提交不会影响其它会话的事务
服务器进程
服务器进程用来处理客户端进程与实例的连接。一个客户端进程总是与一个单独的服务器进程进行通讯。其负责的主要任务如下:
l解析和运行应用程序发布的SQL语句,也包括创建和执行查询计划
l执行PL/SQL代码
l从数据文件中将数据库读入到数据库高速缓冲区中(相反的写过程是由DBWn完成的)
l将结果返回给客户端应用
1.专用服务器进程
在专用服务器配置下,一个客户端能且仅能连接一个服务器进程,服务器进程也只能在客户端连接持续期间为其专一的客户端进程服务,类似一夫一妻制。
2.共享服务器进程
在共享服务器配置下,客户端应用是通过网络连接到服务器进程适配器而不是服务器进程的。适配器从连接客户端处收到请求后将其放在大对象池中的请求队列。第一个可用的共享服务器进程从请求队列处获得请求并进行处理,然后将处理完的结果放到适配器的响应队列中,接着适配器进程监视该队列并将结果转发给客户端。类似于大医院的分诊台
后台进程
1.PMON
进程监视进程,又称进程监视器,它监视其它后台进程并对服务器进程或进程适配器的意外中断进行恢复。PMON用来清除失效的用户进程、释放进程用户资源。如PMON重置活动事务表的状态、不再需要的锁、从活动进程列表中清除其进程ID。
2.SMON
系统监视进程,又称系统监视器,它负责多个系统级的清除任务,包括:
l实例启动时如果需要执行实例恢复,则执行之
l实例恢复期间由于数据文件是只读的或者表空间处于脱机状态引起的事务中断,待表空间联机后,SMON负责恢复这些跳过的中断事务
l清除不再使用的临时段
l对于数据字典管理的表空间,接合自由区
SMON定期检查哪儿需要它,其它进程在需要它时可以调用它
3.DBWn
数据库写入进程,又称数据库写入器,它负责将数据库高速缓冲区中被修改的缓存写入到磁盘。一般一个数据库写入进程(DBW0)即能满足大部分的数据库需求;但在多处理器服务器上,还可以配置DBW1..DBW9和DBWa..DBWj来提升数据库性能。下述情况下,DBWn将脏缓存写入磁盘:
l服务器进程扫描整个缓存后,怎么也找不到干净可用的缓存时。DBWn如果在处理其它操作时,其执行写入是异步的
lDBWn周期性的将缓存写入一个预置的检查点
4.CKPT
检查点进程使用检查点信息更新控制文件和数据文件的头,并且通知DBWn将块写入数据文件。检查点信息包括检查点的位置、SCN、联机重做日志文件中要开始恢复的位置等。
5.MMON
可管理监视进程,执行很多与AWR(自动工作负载信息)相关的工作。例如当一个度量超出其阀值时的写、执行快照等。
6.LGWR
日志写入进程,又称日志写入器,负责管理重做日志缓存。一般是将用户所做的修改写入日志文件,等到了一定时候再写入数据文件。LGWR将缓存中部分连续的区域写入到联机重做日志文件中。Oracle通过分散修改数据库缓存任务来实现脏缓存写入磁盘的分散性,以及通过将快速有序的日志文件写入磁盘来提高其性能。下述情况下,LGWR会将自上次写以来所有拷贝到缓存中的日志条目写入日志文件:
l用户提交了一个事务时
l联机重做日志切换时
l自上次写以来时间达到了3秒时
l重做日志缓冲区达到了1/3或者包含了1M缓存数据时
lDBWn必须将修改的数据写入磁盘时
6.RECO
恢复进程是在分布式数据库用于自动解决失败的分布式事务的。
7.ARCn
当日志切换时,ARCn(归档日志进程)将联机重做日志拷贝到脱机的存储器中。
ARCn仅仅在归档日志模式化且自动归档选项打开时有效。属于可选进程。
8.作业队列进程
是一种后台工具进程,包括CJQ0和Jnnn,前者是作业调度进程,后者是任务队列从属进程。作业队列进程是Oracle用来运行后台任务的,一般的处理方式是批处理。Oracle对其的管理是动态的。也属于可选进程。
9.FBDA
闪回数据归档进程将跟踪表中的历史行数据归档到闪回数据归档资料中。当事务中包含跟踪提交的DML时,FBDA将预先的行数据(未提交前)存储在闪回归档资料中。FBDA也可以保存当前行的元数据。也属于可选进程
10.SMCO
空间管理协调进程管理多个空间管理相关的任务,如预先的空间分配和空间回收,也属于可选进程
习题
1.Oracle启动和关闭分别分几部,每一步都执行什么?关闭有哪几种模式,其差异点是什么?
2.什么是检查点?Oracle使用检查点的目的是什么?线程检查点和增量检查点有什么相同点和不同点?
3.请登录OEM,浏览参数文件中的参数,并查看联机的帮助说明。
4.手工绘制实例的SGA,并逐一解释每个区域的目的和作用
5.请解释DBWn和CKPYT的关系,并解释LGWR的工作机制。
java私塾原创内容
篇2:[]Oracle体系结构参数文件
参数文件中存储着实例内存分配信息、资源位置、设置用户进程、控制文件位置和用户登录信息,大部分参数采用默认值。参数文件分为静态pfile和动态的spfile二进制文本格式文件。静态参数文件的位置:$oracle_home/admin/sid/pfile/
init.ora;在Alter system修改静态参数的时候,还需要关闭数据库修改参数文件才有效。可以把参数文件复制到备份目录下进行备份。动态参数文件存储在服务器上,windows目录$oracle_home/databse/spfilesid.ora ,unix目录$oracle_home/ dbs/
修改动态参数文件用alter system命令修改。
数据启动使用参数文件的规则:
a、使用服务器上的spfilesid.ora文件启动数据库
b、使用服务器上默认的spfile文件启动数据库
c、如果没有找到spfile文件,就用服务器上的initsid.ota文件作为参数文件启动
d、如果没有找到intsid.ora文件,就用服务器上默认的pfile文件来启动
查看参数文件的值
v$parameter
show parameter
show parameter db查看db相关的参数和参数值
从spfile文件中创建pfile:
create pfie='D:backupinit.ora' from spfile;
create pfile='文件名称' from memory
创建spfile:
create spfile='文件名字' from pfile='文件名字';
create spfile from pfile='文件名字';
create spfile from memory
使用警告日志和init.ora重建经过修改的参数文件
把警告日志文件中的非默认的参数值添加到init.ora中,然后通过create spfile
from pfile='文件名称'
修改参数文件的值
alter system set parameter =value
说明:
parameter=value给参数赋值
comment='text'该参数是可选的,注释参数,在v$parameter中的update_comment字段中,
查看延迟生效的参数:
select name from v$parameter where issys_modifiable='dfferred'
取消spfile中设置的参数值:
alter system reset pamater
更改后的参数值为默认值。
通过警告文件来监控数据库
show parameter background_dump_dest //警告文件的目录篇3:[]Oracle 体系结构控制文件(一)
控制文件用于维护数据库物理结构数据的文件,每个数据库至少要有一个,是二进制文件,其中记录了数据库名称、数据文件位置、重做日志文件名称和位置,系统最多可以设置8个控制文件的副本来,但是无论有多少个副本,系统只指定一个控制文件作为检索数据库元数据的主要控制文件。一个数据文件对应一个数据库,但是可以有多个副本存在。当所有副本丢失时,可以通过alter database backup controlfile to trace来重建控制文件。数据库在启动过程中首先通过默认规则打开参数文件,建立实例,再通过参数文件中控制文件的位置,打开控制文件,然后通过控制文件中数据文件、重做日志的位置,校验数据文件一致性,并恢复打开数据文件,完成数据库的启动。通常新建立的数据库有三个控制文件。
查看控制文件:
Select value from v$parameter where name=control_files’;
Show parameter control_files;
启动到mount状态:
Select name from v$controlfile;
查看控制文件中的内容:
V$controlfile_record_section
依赖控制文件的视图:
V$backup v$databse v$tempfile v$tablespace v$archive v$log v$logfile v$loghist日志切换记录v$archived_log归过档的记录
移动控制文件
a、使用pfile文件移动控制文件
利用数据字典获取控制文件的名字
Select value from v$parameter where name=’control_files’
关闭数据库
Shutdown immediate
修改参数文件
修改参数文件的目录和移动参数文件到相应的目录
启动数据
Startup
验证更改的结果
Select name from v$controlfile
//oracle建库时参数文件的副本:$Oracle_base/admin/sid/pfile,另外控制文件只要有一个正常使用的,可以用这个正常的建立各个副本,建立的办法,就是把正确的改成副本名字即可,
b、使用Spfile文件移动控制文件
获取控制文件的名字
Select name from v$controlfile;
更改控制文件的目录及名称或新加的控制文件目录
Alter system set control_files='D:ORACLEPRODUCT10.2.0ORADATASTUDYCONTROL01.CTL','D:ORACLEcontrolfileCONTROL02.CTL','D:ORACLEcontrolfileCONTROL03.CTL' scope=spfile;
移动控制文件到相应的目录
验证控制文件的修改结果
Select name from v$controlfile
备份和恢复控制文件
a、备份控制文件1
Alter databse backup controlfie to ‘D:oraclecontrolfilebackupcontrolfile.ora';
b、备份控制文件2
alter session set sql_trace=true;
alter database backup controlfile to trace;
show parameter user_dump_dest
c、部分控制文件损坏
d、全部丢失和损坏
startup mount
alter database open useing backup controlfile;
控制文件备份后的数据会丢失。
e、使用跟踪文件重建控制文件,trace文件中有脚本
f、手工创建控制文件,根据trace文件命令创建
篇4:[]oracle 体系结构控制文件(二)
情景分析:
a、重做日志、备份控制文件情况下失去全部控制文件
关闭数据库
shutdown immediate
删除控制文件
host del /$oracle_base/oradata/sid/*.ctl
复制控制文件到相应的目录
host copy d:backup $ oracle_base/oradata/sid/
启动数据库到mount状态
startup mount
recover database using backup controlfile until cancel (归档日志丢失)
recover database using backup controlfile until cancel (使用重做日志,顺序错了没关系)
alter database open resetlogs
备份数据
b、重建控制文件完成备份
关闭数据库
shutdown immediate
删除控制文件
启动数据库到mount
startup mount
从trace文件里找到控制文件的脚本
执行脚本
recover database using backup controlfile until cancel (归档日志丢失)
recover database using backup controlfile until cancel (使用重做日志,顺序错了没关系)
alter database open resetlogs;
alrer ablespace temp add tempfile 'd:oracleproduct10.2.0oradatastudytemp01.dbf' size 20971520 resue autoextend on next 655360 maxsize 3276M;
shutdown immediate
startup
备份数据库
c、利用重做日志恢复有数据文件和控制文件备份的数据库
关闭数据库
删除控制文件
删除数据文件
复制备份的控制文件和数据文件到相应的目录
startup mount
recover database using backup controlfile until cancel (归档日志丢失)
recover database using backup controlfile until cancel (使用重做日志,顺序错了没关系)
alter database open resetlogs;
备份数据库
d、联机日志文件丢失,利用备份控制文件和数据文件恢复数据库
关闭数据库
删除控制文件
删除日志文件
删除数据文件
复制备份的控制文件和数据文件到相应的目录
startup mount
recover database using backup controlfile until cancel (归档日志丢失)
recover database using backup controlfile until cancel (使用重做日志,顺序错了没关系)
alter database open resetlogs;
备份数据库
篇5:oracle sql性能2
oracle sql性能2
27基础表的选择
基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的.
如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径.
如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM 子句中列在最后的那个表.
举例: SELECT A.NAME , B.MANAGER FROM WORKER A, LODGING B WHERE A.LODGING = B.LODING;
由于LODGING表的LODING列上有一个索引, 而且WORKER表中没有相比较的索引, WORKER表将被作为查询中的基础表.
28多个平等的索引
当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录.
在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有
当WHERE子句中索引列和常量比较才有效.如果索引列和其他表的索引类相比较. 这种子句在优化器中的等级是非常低的.
如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用. FROM子句中最后的表的索引将有最高的优先级.
如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级.
举例:
DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME, FROM EMP WHERE DEPT_NO = 20 AND EMP_CAT = ‘A’; 这里,DEPTNO索引将被最先检索,然后同EMP_CAT索引检索出的记录进行合并. 执行路径如下: TABLE ACCESS BY ROWID ON EMPAND-EQUAL INDEX RANGE SCAN ON DEPT_IDX INDEX RANGE SCAN ON CAT_IDX
29. 等式比较和范围比较
当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.
举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT = ‘A’; 这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下: TABLE ACCESS BY ROWID ON EMP INDEX RANGE SCAN ON CAT_IDX
30不明确的索引等级
当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的.
举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM EMP WHERE DEPTNO > 20 AND EMP_CAT > ‘A’; 这里, ORACLE只用到了DEPT_NO索引. 执行路径如下: TABLE ACCESS BY ROWID ON EMPINDEX RANGE SCAN ON DEPT_IDX 译者按: 我们来试一下以下这种情况: SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP'; INDEX_NAME UNIQUENES ------------------------------ --------- EMPNO UNIQUE EMPTYPENONUNIQUE SQL> select * from emp where empno >= 2 and emp_type = 'A' ; no rows selected Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)
虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低!
31强制索引失效
如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) .
举例:SELECT ENAME FROM EMP WHERE EMPNO = 7935 AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/ AND EMP_TYPE || ‘’ = ‘A’ /*EMP_TYPE上的索引将失效*/ 这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它. 这里有一个例子关于何时采用这种策略, 假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有索引. SELECT ENAME FROM EMP WHERE EMP_TYPE = ‘A’ AND EMP_CLASS = ‘X’; 优化器会注意到EMP_TYPE上的索引并使用它. 这是目前唯一的选择. 如果,一段时间以后, 另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并. 然而,如果其中一个索引(EMP_TYPE)接近于唯一性而另一个索引(EMP_CLASS)上有几千个重复的值. 排序及合并就会成为一种不必要的负担. 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引. 用下面的方案就可以解决问题. SELECT ENAME FROM EMP WHERE EMP_TYPE = ‘A’ AND EMP_CLASS||’’ = ‘X’;
32避免在索引列上使用计算.
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL > 25000/12;
译者按:
这是一个非常实用的规则,请务必牢记
33自动选择索引
如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.
在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.
举例: SELECT ENAME FROM EMP WHERE EMPNO = 2326 AND DEPTNO = 20 ; 这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录. TABLE ACCESS BY ROWID ON EMP INDEX UNIQUE SCAN ON EMP_NO_IDX 34避免在索引列上使用NOT 通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. 举例: 低效: (这里,不使用索引) SELECT … FROM DEPT WHERE DEPT_CODE NOT = 0; 高效: (这里,使用了索引)SELECT … FROM DEPT WHERE DEPT_CODE > 0; 需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符. NOT > to <= NOT >= to < NOT < to >= NOT <= to >译者按: 在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的. 我做了一些测试: SQL> select * from emp where NOT empno > 1; no rows selected Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE) SQL> select * from emp where empno <= 1; no rows selected Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE) 两者的效率完全一样,也许这符合作者关于” 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点. 35用>=替代> 如果DEPTNO上有一个索引, 高效: SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
36用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.
在下面的例子中, LOC_ID 和REGION上都建有索引.
高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. 注意: WHERE KEY1 = 10 (返回最少记录) OR KEY2 = 20 (返回最多记录) ORACLE 内部将以上转换为 WHERE KEY1 = 10 AND ((NOT KEY1 = 10) AND KEY2 = 20) 译者按: 下面的测试数据仅供参考: (a = 1003 返回一条记录 , b = 1 返回1003条记录) SQL> select * from unionvsor /*1st test*/ 2 where a = 1003 or b = 1; 1003 rows selected. Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 CONCATENATION 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) 4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) Statistics ----------------------------------------------------------0 recursive calls0 db block gets 144 consistent gets0 physical reads0 redo size 63749 bytes sent via SQL*Net to client 7751 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk) 1003 rows processed SQL> select * from unionvsor /*2nd test*/ 2 where b = 1 or a = 1003 ; 1003 rows selected. Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 CONCATENATION 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) 4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) Statistics ----------------------------------------------------------0 recursive calls0 db block gets 143 consistent gets0 physical reads0 redo size 63749 bytes sent via SQL*Net to client 7751 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk) 1003 rows processed SQL> select * from unionvsor /*3rd test*/ 2 where a = 1003 3 union 4 select * from unionvsor 5 where b = 1; 1003 rows selected. Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 SORT (UNIQUE) 2 1 UNION-ALL 3 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) 5 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' 6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) Statistics ----------------------------------------------------------0 recursive calls0 db block gets 10 consistent gets 0 physical reads0 redo size 63735 bytes sent via SQL*Net to client 7751 bytes received via SQL*Net from client 68 SQL*Net roundtrips to/from client1 sorts (memory)0 sorts (disk) 1003 rows processed 用UNION的效果可以从consistent gets和 SQL*NET的数据交换量的减少看出 37用IN来替换OR 下面的查询可以被更有效率的语句替换: 低效: SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 高效 SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
译者按:
这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的.
38避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.
举例:
如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果
所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000
条具有相同键值的记录,当然它们都是空!
因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
举例: 低效: (索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 高效: (索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0; 39总是使用索引的第一个列 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10)); Table created. SQL> create index multindex on multiindexusage(inda,indb); Index created. SQL> set autotrace traceonly SQL> select * from multiindexusage where inda = 1; Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE' 2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE) SQL> select * from multiindexusage where indb = 1; Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 40ORACLE内部操作 当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. ORACLE Clause 内部操作 ORDER BY SORT ORDER BY UNION UNION-ALL MINUS MINUS INTERSECT INTERSECT DISTINCT,MINUS,INTERSECT,UNION SORT UNIQUE MIN,MAX,COUNT SORT AGGREGATE GROUP BY SORT GROUP BY ROWNUM COUNT or COUNT STOPKEY Queries involving Joins SORT JOIN,MERGE JOIN,NESTED LOOPS CONNECT BY CONNECT BY
41用UNION-ALL 替换UNION ( 如果有可能的话)
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.
如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.
举例: 低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’
译者按:
需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是
要从业务需求分析使用UNION ALL的可行性.
UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这
块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量
Select substr(name,1,25) “Sort Area Name”, substr(value,1,15) “Value” from v$sysstat where name like 'sort%'
42使用提示(Hints)
对于表的访问,可以使用两种Hints. FULL 和 ROWID FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FROM EMP WHERE EMPNO = 7893; ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表. 通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引. 如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留 在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用. 例如: SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * FROM WORK; 索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称 例如: SELECT /*+ INDEX(LODGING) */ LODGING FROM LODGING WHERE MANAGER = ‘BILL GATES’;
在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引.
ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等.
译者按:
使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改.
这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化.
对ORACLE的优化器还是要有信心(特别是CBO)
43用WHERE替代ORDER BY
ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. 例如: 表DEPT包含以下列:DEPT_CODE PK NOT NULL DEPT_DESC NOT NULL DEPT_TYPE NULL 非唯一性的索引(DEPT_TYPE) 低效: (索引不被使用) SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE EXPLAIN PLAN: SORT ORDER BY TABLE ACCESS FULL 高效: (使用索引) SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0 EXPLAIN PLAN: TABLE ACCESS BY ROWID ON EMP INDEX RANGE SCAN ON DEPT_IDX 译者按: ORDER BY 也能使用索引! 这的确是个容易被忽视的知识点. 我们来验证一下: SQL> select * from emp order by empno; Execution Plan ---------------------------------------------------------- 0SELECT STATEMENT ptimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE)
44避免改变索引列的类型.
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
SELECT … FROM EMP WHERE EMPNO = ‘123’ 实际上,经过ORACLE类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123’)
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123 这个语句被ORACLE转换为: SELECT … FROM EMP WHERE TO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到!
译者按:
为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.
45需要当心的WHERE子句
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0; 使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0; 下面的例子中, ‘||’是字符连接函数. 就象其他函数那样, 停用了索引. 不使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’; 使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = ‘AMEX’ AND ACCOUNT_TYPE=’ A’; 下面的例子中, ‘+’是数学函数. 就象其他数学函数那样, 停用了索引. 不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT + 3000 >5000; 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT > ;
下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.
不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME); 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);
译者按:
如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的方案.
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/
SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*将使用索引*/
46连接多个扫描
如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接.
举例:
SELECT * FROM LODGINGWHERE MANAGER IN (‘BILL GATES’,’KEN MULLER’);优化器可能将它转换成以下形式SELECT * FROM LODGINGWHERE MANAGER = ‘BILL GATES’OR MANAGER = ’KEN MULLER’;
当选择执行路径时, 优化器可能对每个条件采用LODGING$MANAGER上的索引范围扫描. 返回的ROWID用来访问LODGING表的记录 (通过TABLE ACCESS BY ROWID 的方式). 最后两组记录以连接(CONCATENATION)的形式被组合成一个单一的集合.
Explain Plan : SELECT STATEMENT ptimizer=CHOOSE CONCATENATION TABLE ACCESS (BY INDEX ROWID) OF LODGING INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) TABLE ACCESS (BY INDEX ROWID) OF LODGING INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE)
译者按:
本节和第37节似乎有矛盾之处.
47CBO下使用更具选择性的索引
基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率.
如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录.
比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少.
如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的
操作. 也许会比全表扫描的效率更低.
译者按:
下列经验请参阅:
a如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
b在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的
区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
48避免使用耗费资源的操作
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.
通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.
译者按:
如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
49优化GROUP BY
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.
低效: SELECT JOB , AVG(SAL) FROM EMP GROUP JOBHAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ 高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ GROUP JOB
译者按:
本节和14节相同. 可略过.
50使用日期
当使用日期是,需要注意如果有超过5位小数加到日期上, 这个日期会进到下一天!
例如:
1. SELECT TO_DATE(‘01-JAN-93’+.99999) FROM DUAL; Returns: ’01-JAN-93 23:59:59’ 2. SELECT TO_DATE(‘01-JAN-93’+.999999) FROM DUAL; Returns: ’02-JAN-93 00:00:00’
译者按:
虽然本节和SQL性能优化没有关系, 但是作者的功力可见一斑
51. 使用显式的游标(CURSORs)
使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.
52. 优化EXPORT和IMPORT
使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度.
ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表中最大的列相当,否则列值会被截断.
译者按:
可以肯定的是, 增加BUFFER会大大提高EXPORT , IMPORT的效率. (曾经碰到过一个CASE, 增加BUFFER后,IMPORT/EXPORT快了10倍!)
作者可能犯了一个错误: “这个值至少要和表中最大的列相当,否则列值会被截断. “
其中最大的列也许是指最大的记录大小.
53. 分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.
篇6:了解Oracle体系结构前必须掌握的两个概念
对于初学者来讲,在了解Oracle体系结构之前必须掌握以下两个基本的概念: 数据库和实例,
了解Oracle体系结构前必须掌握的两个概念
,
篇7:网络体系结构
是指通信系统的整体设计,它为网络硬件、软件、协议、存取控制和拓扑提供标准,它广泛采用的是国际标准化组织(ISO)在1979年提出的开放系统互连(OSI-OpenSystemInterconnection)的参考模型,
OSI参考模型用物理层、数据链路层、网络层、传送层、对话层、表示层和应用层七个层次描述网络的结构,它的规范对所有的厂商是开放的,具有知道国际网络结构和开放系统走向的作用。它直接影响总线、接口和网络的性能。目前常见的网络体系结构有FDDI、以太网、令牌环网和快速以太网等。从网络互连的角度看,网络体系结构的关键要素是协议和拓扑。
篇8:客户/服务器体系结构
Sybase是一种建立在客户/服务器体系结构上的数据库管理系统,
●什么是客户/服务器体系结构?
从硬件角度看,客户/服务器体系结构是指将某项任务在两台或多台机器之间进行分配,其中客户机(Client)用来运行提供用户接口和前端处理的应用程序,服务器机(Server)提供客户机使用的各种资源和服务。
从软件角度看,客户/服务器体系结构是把某项应用或软件系统按逻辑功能划分为客户软件部分和服务器软件部分,
客户软件部分一般负责数据的表示和应用,处理用户界面,用以接收用户的数据处理请求并将之转换为对服务器的请求,要求服务器为其提供数据的存储和检索服务;服务器端软件负责接收客户端软件发来的请求并提供相应服务。
客户/服务器融合了大型机的强大功能和中央控制以及PC机的低成本和较好的处理平衡。客户/服务器为任务的集中/局部分布提供了一种新的方法,这种体系能够使用户对数据完整性、管理和安全性进行集中控制。在缓解网络交通和主机负荷以及满足用户需要方面,客户/服务器体系提供了良好的解决方案。
总之,客户/服务器的工作模式是:客户与服务器之间采用网络协议(如TCP/IP、IPX/SPX)进行连接和通讯,由客户端向服务器发出请求,服务器端响应请求,并进行相应服务。
★ 软件开题报告
【Oracle体系结构2(通用8篇)】相关文章:
甲骨文高考作文2023-01-15
java培训实习报告2023-06-16
暑期关于学习java实习报告2023-01-16
java毕业实习报告2022-05-02
财务管理中的辩证关系2022-08-18
从零开始学Oracle―约束2022-04-30
erp计划书2022-11-19
web前端开发实训总结2022-07-22
SQL Server触发器及触发器中的事务学习2022-12-01
有关规则的语句2023-04-02