硬解析的过程涉及大量递归
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)语