oracle数据库的深度解析

1.ORACLE数据库与实例的区别

1.1数据库(DATABASE):物理操作系统文件或磁盘的集合。
1.2实例(INSTANCE):一组ORACLE后台进程/线程以及一个共享内存区,这些内存由同一个计算机上运行的线程/进程所共享。这里可以维护易失的、非持久性内容(有些可以刷新输出到磁盘)。就算没有磁盘存储,数据库实例也能存在。
1.3实例和数据库之间的关系是:数据库可以由多个实例装载和打开,而实例可以在任何时间点装载和打开一个数据库。实际上,准确地讲,实例在其整个生存期中最多能装载和打开一个数据库!实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,ORACLE的真正应用集群(REAL APPLICATION CLUSTERS,RAC)是一个例外,这是ORACLE提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘上)。由此,我们可以同时从多台不同的计算机访问这个数据库。ORACLE RAC能支持高度可用的系统,可用于构建可扩缩性极好的解决方案。

2.游标

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条选择语句相关联,因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。
2.1.声明游标
同其它变量一样,我们也可以定义游标的访问类型:全局、共享、实例或局部。 DECLARE MY_CURSOR CURSOR KEYSET FOR SELECT * FROM table
2.2.打开游标
OPEN CUSTOMERCURSOR;
2.3.提取数据
FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中。已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中可以指定游标的名称和目标变量的名称。

3.ORACLE共享池详解

3.1共享池的几个组成部分:LIBRARY CACHE中包含共享SQL区(SHARED SQL AREAS),PL/SQL存储过程和包和控制结构(如锁,库缓存句柄)。
  不论什么服务进程项都可以访问共享SQL区。
  ORACLE会为每一条SQL语句执行(每运行一条语句ORACLE都会打开1个游标)供给1个共享SQL区(SHARED SQL AREAS)和私有SQL区(PRIVATE SQL AREAS属于PGA)。当发现两个(或多个)用户在运行同一条SQL语句时,ORACLE会重新组织SQL区,使这些用户能重用共享SQL区。但他们还会在私有SQL区中保存一份这条SQL语句的拷贝。
  1个共享SQL区中保存了一条语句的解析树和查询计划。在多用户系统中,ORACLE通过为SQL语句使用同一共享SQL区多次运行来节省内存。
  当一条新的SQL语句被解析时,ORACLE从共享池中分配一块内存来存储共享SQL区。这块内存的大小与这条语句的复杂性相关。如果SHARED POOL不够空间分配给共享SQL区,ORACLE将释放从LRU链表中查找到最近最少使用的内存块,直至有足够空间给新的语句的共享SQL区。而从解析语句到分配共享SQL区是1个比较耗损CPU的过程,这是倡导使用绑定变量的理由之一。在没有使用绑定变量的情况下,语句的变量的数据不同,ORACLE将之视为一条新的语句,重复上述的解析,内存分配动作,将大大耗损系统资源,降低系统性能。
  ORACLE对PL/SQL程序单元(包括存储过程,函数,包,匿名PL/SQL块和触发器)的处理过程和对单个SQL语句的处理工程相仿,ORACLE会分配1个共享区来存储被解析,编译过的程序单元。同时分配1个私有地区范围来储存安放运行程序单元的会话所拟定的程序单元的参量据(包括当地变量,全局变量和包变量,这也称作包的实例化)和用于执行程序所需的内存。如果多个用户运行同一程序单元,则他们共享同1个共享地区范围,并且各自连结一份私有地区范围,用于用户会话中执行的变量。
  而1个PL/SQL程序单元中的每条单个SQL语句的处理过程则和上述的SQL语句的处理过程相同。需要注重一点,尽管这些语句是从PL/SQL程序单元中来的,但ORACLE照旧会为这些语句分配一块共享SQL区,同时为每个用户分配1个相应的私有SQL区。
3.2. 字典缓存
  数据字典是有关于数据库的参考信息,数据库的结构信息和数据库中的用户信息的一组表和视图的集合,如我们常使用到的部分V视图,DBA_视图均属于数据字典。在SQL语句执行过程当中,ORACLE在需要的情况下会非常迅速地访问这些数据字典。因为ORACLE对数据字典的访问十分频繁,因此将数据字典信息缓存在共享池的数据字典缓冲(DATA DICTIONARY CACHE)中。数据字典缓存也被称作行缓存(ROW CACHE),因为它是以记载举动单元存储数据的,而不像 BUFFER CACHE以数据块为单元存储数据。
3.3共享池的内存管理:共享池是根据修正过的LRU算法来决定是否刷出(FLUSH OUT)其中的对象的,否则这些对象就一直连结在共享池中。如果共享池需要为1个新对象分配内存,并且共享池中没有足够内存时,内存中那些不经常使用的对象就被释放。1个被许多会话使用过的共享池对象,即使最初创建它的进程项已结束,只要它是有用的,都一直会被修正过的LRU算法连结在共享池中。这样就使1个多用户的ORACLE系统对SQL语句的处理和内存耗损最小。
3.3.1当一条SQL语句被提交给ORACLE执行,ORACLE会自动执行以下的内存分配步调:
(1)ORACLE检查共享池,看是否已存在关于这条语句的共享SQL区。如果存在,这个共享SQL区就被用于执行这条语句。而如果不存在,ORACLE就从共享池中分配一块新的共享SQL区给这条语句。同时,不管共享SQL区存在与否,ORACLE都会为用户分配一块私有SQL区以保存这条语句相关信息(如变量值)。
(2)ORACLE为会话分配1个私有SQL区。私有SQL区的所在与会话的连接方式相关。
3.3.2在以下情况下,ORACLE也会将共享SQL区从共享池中释放出来:
(1)当使用ANALYZE语句更新或删除表,簇或引得的统计信息时,所有与被阐发对象相关的共享SQL区都会被从共享池中释放失。当下一次被释放失的语句被执行时,又重新再1个新的共享SQL区中根据被更新过的统计信息重新解析。
(2)当对象结构被修改过后,与该对象相关的所有共SQL区都被表示为无效(INVALID)。在下一次运行语句时再重新解析语句。
(3)如果数据库的全局数据库名(GLOBAL DATABASE NAME)被修改了,共享池中的所有信息都被清空失。
(4)DBA经手工办理方式清空共享池: ALTER SYSTEM FLUSH SHRED_POOL;

4.ORACLE数据库文件目录详解

在ORACLE DATABASE 10G中,ORACLE的目录结构是由ORACLE_BASE及其子目ORACLE_HOME、ADMIN、FLASH_RECOVERY_AREA和ORADATA目录构成的。为方便讨论,用ORACLE_BASE代表ORACLE目录树的根,用ORACLE_HOME表示根目录下的主目录。
4.1.ORACLE_BASE目录
ORACLE_BASE代表ORACLE目录树的根。如果使用ORACLE UNIVERSAL INSTALLER进行安装,则ORACLE_BASE是指:/MOUNT_POINT/APP/ORACLE (/U01/APP/ORACLE)
4.2.ORACLE_HOME目录
ORACLE_HOME主目录位于$ORACLE_BASE\PRODUCT\10.2.0下,它包含与ORACLE软件运行有关的子目录和网络文件以及选定的组件等;若在主机上第一次且只安装了ORACLE数据库,没有其他ORACLE产品,则使用默认的主目录\DB_1;如果在同一台主机的同一个根目录下安装多个产品或安装了第2次,则ORACLE_HOME主目录会以DB_N的形式出现,即DB_2、DB_3等。这也是为什么在ORACLE_BASE目录可以有多个ORACLE_HOME目录的缘故。
ORACLE_HOME目录中包括的主要子目录有:
\BIN——主要包含用于数据库管理的各种命令等。
\CSS——与ORACLE CLUSTER SYNCHRONIZATION服务有关的文件。
\DBS——存放数据库服务器端的参数文件SPFILE。
\DEMO——存放数据库实例模式的脚本等。
\INSTALL——用于存储ORACLE安装后的端口号,ISQLPLUS以及ENTERPRISE MANAGER DATABASE CONTROL启动并登录的方式等。
\NETWORK\ADMIN——有关监听器LISTENER.ORA和SQLNET.ORA以及TNSNAMES.ORA等。
\SYSMAN\CONFIG——用于与ORACLE ENTERPRISE MANAGEMENT有关的端口管理等。
4.3.ADMIN目录
数据库管理文件均存储在ORACLE_BASE\ADMIN\DB_NAME目录下。各个子目录的主要含义如下:
\BDUMP——后台进程跟踪文件。
\CDUMP——信息转储文件(CORE DUMP)。
\CREATE——数据库创建文件。
\EXP——数据库导出文件。
\PFILE——初始化参数文件。
\UDUMP——用户SQL追踪文件。
4.4.ORADATA目录
数据库文件存储在ORACLE_BASE\ORADATA\DB_NAME目录下,该目录主要存储数据库的控制文件、数据文件、重做日志文件。其中
.DBF文件对应数据库中每个表空间;.CTL文件为控制文件;.LOG文件对应重做日志文件组及其成员。
4.5.FLASH_RECOVERY_AREA目录
FLASH_RECOVERY_AREA目录存储并管理与备份和恢复有关的文件。它包含系统中每个数据库的子目录。该目录可用于存储与恢复有关的文件,如控制文件、联机重做日志副本、归档日志、闪回日志以及ORACLE数据库恢复管理器(RMAN)备份等。

5.ORACLE如何使用索引的类型

索引就好象一本字典的目录。凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。数据库也是如此。凭借ORACLE数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。虽然在表中是否创建索引,不会影响到ORACLE数据库的使用,也不会影响数据库语句的使用。可是若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。当表中的记录比较多的时候,其查询效率就会很低。所以,合适的索引,是提高数据库运行效率的一个很好的工具。
不过,并不是说表上的索引越多越好。在理论上,虽然一个表可以设置无限的索引。但是,表中的索引越多,维护索引所需要的开销也就越大。每当数据表中记录有增加、删除、更新变化的时候,数据库系统都需要对所有索引进行更新。
5.1在基数小的字段上要善于使用位图索引。
基数是位图索引中的一个基本的定义,它是指数据库表中某个字段内容中不重复的数值。如在员工信息表中的性别字段,一般就只有男跟女两个值,所以,其基数为2。
对于要查询基数小的字段,利用位图索引可以提高查询的效率。这主要是因为标准索引是通过在索引中保存排序过的索引列以及对应的ROWID来实现的。若我们在基数小的列上建立标准索引的话,则其会返回大量的记录。
而当我们在创建位图索引的时候,在ORACLE会对整个表进行扫描,并且会为索引列的每个取值建立一个位图。若内容相同,则在位图上会以一个相同的数字表示。此时,若这个字段的基数比较小的话,则若需要实现对整个字段的查询的话,效率就会非常的高。因为此时,数据库只要位图中数字相同的内容找出来即可。
  除了在数据表某列基数比较小的情况下,采用位图索引外,在WHERE限制条件中,若我们多次采用AND或者OR条件时,也建议采用位图索引。因为当一个查询引用了一些部署了位图索引的列的时候,这些位图可以很方便的与AND或者OR 运算符操作结合以快速的找出用户所需要的记录。
但是并不是在条件语句中包含运算符的时候,采用位图索引都能够提供比较高的效率。一般来说,只有AND 或者OR运算符的时候,位图索引才会比较具有优势。若此时用户采用大于号或者不等于号作为条件语句中的限制条件的时候,则往往采用标准索引具有更大的优势。
在数据库设计中,一般只有在三种情况下才采用位图索引。一是列的基数比较小,而有可能需要根据这些字段的内容查找相关的记录;二是在条件语句中,用到了AND或者OR运算符的时候,第三种情况是,需要用到NULL作为查询的限制条件。因为标准查询一般情况下,会忽略所有的NULL值列,此时,就需要采用位图索引。因为位图索引会记录相关的NULL值列信息。
5.2创建索引的一些限制条件。
一是不要对一些记录内容比较少的表建立索引。无论是表上的,还是字段上,都不要建立索引。
二是若表中的内容比较大,但是,这个表基本上不怎么查询的时候,则只需要在表上建立索引即可;而不需要在字段上建立索引。如现在在ERP系统中,有一张表是“AD_TABLE”。其存储的是这个数据库中相关表的信息。这张表只有在数据库设计的时候才会用到。故这张表中的记录虽然比较多,但是由于用户用的比较少,所以,一般没有必要为这张表建立列级别上的索引。而直接用表索引来代替。
三是在一些NULL字段上,要根据实际情况来判断是否要建立索引。为了提高查询效率,若某个记录可能为空,并且经常需要以NULL为条件进行查询的时候,则最好给这个字段添加一个索引,并且最好建立位图索引。相反,若虽然可能会以NULL这个条件作为查询的限制语句,但是,用的不是很多的时候,则就没有必要为其建立索引。
5.3多表连接查询的索引设计。
需要利用JOIN语句,把某些表格关联起来。为了提高数据库的查询效率,这些用来关联的字段,最好能够建立索引。这可以显著的提高查询的速度。
5.4在表的更新速度与查询速度之间寻求一个平衡点。
索引本身并不影响数据库的使用,其主要是为了提高数据库的查询效率。但是,由于当数据库的表中的数据更新的时候,包括记录的增加、删除、更改等等,都会对虽有的索引进行更新。 索引虽然可以提高查询速度。但是,也会对一些表的更新操作产生不良的影响。当在表中建立的索引越多,这个不利影响也会越大。所以在设置索引的时候,还需要注意,在这两个之间需要一个均衡点。
一般来说,当某个表多数用来查询、更新相对来说比较上的话,则要多多采用索引。相反,当某个表记录更新居主导,查询相对来说比较少的话,则不要建立太多的索引,避免对更新的速度差生不利影响。

6.数据库的专用服务器架构与共享架构的区别

(1)专用服务器架构:每一个客户端的程序只能连接一个指定的服务器进程,且在这个客户端的SESSION期间,这个服务器进程不能被另一个客户端进程所共享,每一个新的SESSION都被安排到一个指定的服务器进程。
(2)共享服务器架构:数据库用一个池来存放多个SESSION的共享进程,且允许多个客户端来连接一个数据库实例。

7.多CPU和并行查询方式的利用

7.1、尽量利用多个CPU处理器来执行事务处理和查询
CPU的快速发展使得ORACLE越来越重视对多CPU的并行技术的应用,一个数据库的访问工作可以用多个CPU相互配合来完成,加上分布式计算已经相 当普遍,只要可能,应该将数据库服务器和应用程序的CPU请求分开,或将CPU请求从一个服务器移到另一个服务器。对于多CPU系统尽量采用 并行查询选项方式进行数据库操作。
7.2、使用PARALLEL QUERY OPTION(PQO,并行查询选择)方式进行数据查询
使用PQO方式不仅可以在多个CPU间分配SQL语句的请求处理,当所查询的数据处于不同的磁盘时,一个个独立的进程可以同时进行数据读取。

8.高效地进行SQL语句设计

(1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
(2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的可能性也会大大增加。
(3)限制动态SQL的使用,虽然动态SQL很好用,但是即使在SQL共享池中有一个完全相同的查询值,动态SQL也会重新进行语法分析。
(4)避免不带任何条件的SQL语句的执行。没有任何条件的SQL语句在执行时,通常要进行FTS,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程。
(5)如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现,而不是用SQL程序中实现。
(6)可以通过取消自动提交模式,将SQL语句汇集一组执行后集中提交,程序还可以通过显式地用COMMIT和ROLLBACL进行提交和回滚该事务。
(7)检索大量数据时费时很长,设置行预取数则能改善系统的工作表现,设置一个最大值,当SQL语句返回行超过该值,数值库暂时停止执行,除非用户发出新的指令,开始组织并显示数据,而不是让用户继续等待。

9.、充分利用数据的后台处理方案减少网络流量

9.1、合理创建临时表或视图
所谓创建临时表或视图,就是根据需要在数据库基础上创建新表或视图,对于多表关联后再查询信息的可建新表,对于单表查询的可创建视图,这样可充分利用数 据库的容量大、可扩充性强等特点,所有条件的判断、数值计算统计均可在数据库服务器后台统一处理后追加到临时表中,形成数据结果的过程可用数据库的过程或 函数来实现。
9.2、数据库打包技术的充分利用
利用数据库描述语言编写数据库的过程或函数,然后把过程或函数打成包在数据库后台统一运行包即可。
9.3、数据复制、快照、视图,远程过程调用技术的运用
数据复制,即将数据一次复制到本地,这样以后的查询就使用本地数据,但是只适合那些变化不大的数据。使用快照也可以在分布式数据库之间动态复制数据,定义 快照的自动刷新时间或手工刷新,以保证数据的引用参照完整性。调用远程过程也会大大减少因频繁的SQL语句调用而带来的网络拥挤。

总之,对所有的性能问题,没有一个统一的解决方法,但ORACLE提供了丰富的选择环境,可以从ORACLE数据库的体系结构、软件结构、模式对象 以及具体的业务和技术实现出发,进行统筹考虑。提高系统性能需要一种系统的整体的方法,在对数据库进行优化时,应对应用程序、I/O子系统和操作系统 (OS)进行相应的优化。优化是有目的地更改系统的一个或多个组件,使其满足一个或多个目标的过程。对ORACLE来说,优化是进行有目的的调整组件级以 改善性能,即增加吞吐量,减少响应时间。

10.ORACLE支持的数据类型及长度范围

CHAR 定长 最大2000个字符。查询的速度极快浪费空间,查询比较多的数据用。
VARCHAR2(20) 变长 最大4000个字符。 节省空间
CLOB字符型大对象 最大4G
NUMBER范围 -10的38次方 到 10的38次方 ,可以表示整数,也可以表示小数
NUMBER(5,2) 表示5位有效数,2位小数 ,范围:-999.99到999.99
NUMBER(5) 表示一个5位整数 范围99999到-99999
DATE 包含年月日和时分秒 ORACLE默认格式 1-1月-1999
TIMESTAMP 这是ORACLE9I对DATE数据类型的扩展。可以精确到毫秒。
BLOB 二进制数据 可以存放图片/声音 最大4G 一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。

上一篇:Oracle几种update语句分析
下一篇:Oracle存储过程的优化

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值