background image

  硬解析的过程涉及大量递归

SQL 调用,非常消耗资源,数据库系统为提高效率将 SQL

语句的解析信息存储在共享内存结构中;当第二次执行这条

SQL 语句时,可从共享的内存

结构中获得该

SQL 语句的解析信息时称之为软解析。软解析相对硬解析省却了大部分操作,

时间可大大缩短。

   图 6 显示执行 10 000 次查询,每次都是硬解析,图 7 显示执行 10 000

次查询,第一次是硬解析,其余的都是软解析,统计信息显示只解析

1 次。

  图

6 显示硬解析 10 000 次,累计时间消耗 10.45 秒,图 7 显示只发生 1 次硬解析,消耗

时间几近为

0。软解析的实现与应用开发中 SQL 语句的编写直接相关,例如:“select name 

from tbluser where userid=1”和“select name from tbluser where userid=2”两条语句,他们的差

别在于查询条件的值不同,又比如

“SELECT name FROM tbluser where userid=1”和“select 

name from tbluser where userid=1”两条语句,他们的差别在于关键字 select 和 from 的大小写

不同,这些对于数据库来说可能都是不同的

SQL 语句。

  

Oracle 数据库中保存 SQL 解析信息时以整个 SQL 文本计算的哈希值作为键值,SQL 文

本的细微差异都会导致硬解析发生。

  进行软件开发时需要定义

SQL 开发规范,规定 SQL 文本中的大小写限制、空格多少等,

其次要使用预编译语句(比如

jdbc 中使用 PreparedStatement),避免 SQL 语句中直接写查

询条件值,应由变量替代,以提高软解析率。

  通过减少读写次数降低

IO 响应时间。

  数据库的读操作分为物理读和逻辑读两种,物理读指从磁盘读取数据,逻辑读指从内

存获取数据。在计算机的存储结构中,磁盘读写的速度远低于内存读写速度,为降低读操作

响应时间,要尽可能减少读,更要尽可能减少磁盘读,减少读但不能避免读。合理利用索引

结构定位数据可大大降低读的数据量,图

8 显示有索引情况下读 10000 行数据的统计信息。

  图

7 和图 8 的数据都来源于查询同一数据库表的 10000 行记录,区别在于图 8 显示表中

有索引时的查询统计信息。分析这两个图中

Fetch 行中 query 列的数据量可知,没有索引时查

询走全表扫描,读

10000 行数据累计读 680000 块数据,平均读每行数据要扫描 68 块才读到

需要的数据;有索引情况下读

10000 行数据累计读 30020 块数据,平均读每行数据仅扫描

3.002 块,首先查找索引获得数据的 ROWID,再根据 ROWID 读数据行,从而避免了全表扫

描。减少物理读的有效措施是提高缓存存储量,使用内存缓存读取过的数据,使之后的数据

读取直接从内存中获得。

  数据库的写操作由后台进程完成,数据库系统为提高性能,都是先写日志文件,再根

据触发条件写数据文件。这里与

SQL 编写相关的是日志文件的写操作,提交(COMMIT)语