oracle sql 高级编程学习笔记(一)

前言

作为一个java开发员,可能都会认为数据库没有必要过于精通,只需能写出满足业务的crud(增删改查)的sql语句即可,殊不知就像开车一样,我们不能只仅仅满足于开车,而对车子原理不屑。那样我们真的只能仅仅停留在java开发上,技术是永远都不嫌多的,去年我也是抱着我是一个java开发员,数据库的东西根本不必做深入的了解,直到今年由于发展需要,转而做报表开发,才深刻意识到自已在数据库上的欠缺,方又重新拾起一年前只翻了几页的oracle sql高级编程。

一、数据库内存结构

通常我们所说的‘Oracle数据库’既用来指存储在硬盘上内部存有数据的数据库文件,也指用来管理这些文件的内存结构。数据库归属于数据文件,
而实例归属于内存结构。一个实例由系统全局内存区域(SGA)以及一系列后台进程组成。每一个连接到数据的用户都是通过一个客户端进程来进行管理,客户端进程是与服务器进程相联结,每一个服务器进程都会被分配一块私有的内存区域,称为程序共享内存区域(PGA)。oracle实例结构图如下

oracle sql 高级编程学习笔记(一)_第1张图片

1.系统全局区(SGA)

SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享, 当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。 SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。

1.1 共享池
共享池是内存中最关键的部分之一,非常的繁忙和重要。
SQL共享池包含数据字典缓存区(data dictionary cache)及库缓存区(librarycache),即对数据库进行操作的语句信息。当数据块缓冲区和字典缓存区能够共享数据库用户间的结构及数据信息时,库缓存区允许共享常用的SQL语句。
SQL共享池包括执行计划及运行数据库的SQL语句的语法分析树。在第二次运行(由任何用户)相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度。
SQL共享池通过LRU算法来管理。当SQL共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间。如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。
所以sql语句要考虑共享性,唯一性的sql愈多,性能就越差,语句共享性能差,响应的时间也就越大。
SQL共享池的大小(以字节为单位)由init.ora文件参数SHARED_POOL_SIZE决定。
1)字典缓存区 (data dictionary cache)
数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息(如检查用户查询一个表的授权)时,将读取数据字典表并且将返回的数据存储在字典缓存区的SGA中
数据字典缓存区通过最近最少使用(LRU)算法来管理,字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHARED_POOL_SIZE参数来设置。
如果字典缓存区太小,数据库就不得不反复查询数据字典表以访问数据库所需的信息,这些查询称为循环调用(recuesivecall),这时的查询速度相对字典缓存区独立完成查询时要低。
2)库高速缓存区(library cache)
执行过的每一个sql语句在共享池都存有解析后的内容。储存这些的数据的地方称为库高速缓存区(library cache),执行每个sql前,oracle都会检查在库高速缓冲区是否已经存在同样的语句,如果存在,会直接从缓存区读取,而不是再去解析一遍,运行方法,存储过程等也是一样。解析包括验证语法,检验提及的对象,以及确认用户的权限。这些通过后,检查是不是已经执行过,如果是,直接取回解析信息重用,这种类型解析为软解析,如果不存在,需执行所有的工作,并存到高速缓冲区以便将来重用。这类解析为硬解析。
硬解析比软解析需要做的工作多得多。

2).1 、完全相同的语句
为确定一个sql语句是否执行过,可以通过v$sql 来查看。这个视图提供了共享区sql的统计信息。
1)、小写与大写字母不同,语句添加注释也不同
2)、sql常量不同也不同,绑定变量,无论变量值是否一样,都是相同。
2、 缓冲区缓存
缓冲区缓存是SGA最大的部份之一。在数据块从硬盘中读取处理来或者写入硬盘之前,用与存储数据块。块orale操作数据的最小数据单位,块包含数据表的行和索引条目,需要注意的是oracle必须读取块来获取sql需要的数据行。

在缓冲区缓存为每个块维护了接触计数器,接触计数越高在缓冲区缓存保存的时间就越久。
这里还需要理解的东西是锁存器,锁存器是oracle为了读取高速缓冲或者其他内存结构的信息时必须获得的一种锁,锁存器可以保存高速缓冲区以及其他内存结构避免同时被两个会话进行修改。
提高效率,减少锁存器,sql语句解析,以及验证块、更新LRU信息以及接触计数的时候都需要获取锁存器。所以提高效率的方法是在满足数据需求的同时访问尽可能少的数据块。
当Oracle确定数据块已经出现在缓冲区缓存的时候,这样的访问为逻辑访问,如果该块必须从硬盘中取出,则称为物理访问,很明显逻辑访问比物理访问的效率更高。
总结:重用高速缓存区以及缓冲区缓存中的信息代码,尽可能少的访问数据块

备注:文章主要参考oralce sql高级编程

你可能感兴趣的:(数据库,Oracle,sql高级编程学习笔记)