例子:利用格式化的输出文件进行sql调整
第一步: - 现看格式化输出文件最后部分,即汇总部分
===========================================================
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
| call | count | cpu | elapsed | disk | query | current | rows |
|--------- |------- |------ |--------- |--------- |-------- |--------- |-------- |
| Parse | [A] 7 | 1.87 | 4.53 | 385 | [G] 553 | 22 | 0 |
| Execute | [E] 7 | 0.03 | 0.11 | [P] 0 | [C] 0 | [D] 0 | [F] 0 |
| Fetch | [E] 6 | 1.39 | 4.21 | [P] 182 | [C] 820 | [D] 3 | [F] 20 |
--------------------------------------------------------------------------
Misses in library cache during parse: 5
Misses in library cache during execute: 1
8 user SQL statements in session.
12 internal SQL statements in session.
[B] 54 SQL statements in session.
3 statements EXPLAINed in this session.
(1)。 通过比较 [A] 与 [B],我们可以发现是否有过量的parsing现象。在上面的例子中,我们可以看到在session中执行了54个语句,但是只有7次parses,所以这是比较正常的,没有过量的parse现象。
(2)。 利用 [P], [C] & [D] 来决定数据库高速缓存的命中率问题
Hit Ratio is logical reads/physical reads:
Logical Reads = Consistent Gets + DB Block Gets
Logical Reads = query + current
Logical Reads = Sum[C] + Sum[D]
Logical Reads = 0+820 + 0+3
Logical Reads = 820 + 3
Logical Reads = 823
Hit Ratio = 1 - (Physical Reads / Logical Reads)
Hit Ratio = 1 - (Sum[P] / Logical Reads)
Hit Ratio = 1 - (128 / 823)
Hit Ratio = 1 - (0.16)
Hit Ratio = 0.84 or 84%
(3)。 我们希望fetch的次数要比rows小,即一次fetch可以取多行数据(array fetching),
可以我们可以更高效的取得查询数据。
这可以通过比较[E]与[F].
[E] = 6 = Number of Fetches
[F] = 20 = Number of Rows
从上面的信息中我们可以看到,6次fetch总共取了20行数据,结果不是很坏。如果使用了经过良好配置arrayfetching,则可以用更少的fetch次数取到同样数量的数据,性能会更好。
(4)。 [G] 表示为了对语句进行分析,读数据字典告诉缓存的次数
- 这个参数对性能的影响不大,一般不用关心。而且这个统计值一般不是我们可以控制的。
第二步 – 检查耗费大量资源的语句
===============================================
update …
where …
| call | count | cpu | elapsed | disk | query | current | rows |
|--------- |------- |----- |--------- |------ |-------- |--------- |-------- |
| Parse | 1 | 7 | 122 | 0 | 0 | 0 | 0 |
| Execute | 1 | 75 | 461 | 5 | [H] 297 | [I] 3 | [J] 1 |
| Fetch | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-----------------------------------------------------------------------
[H] 表明需要访问297个数据块才能找到我们需要修改的数据。
[I] 表明我们的修改操作才修改3个数据块中的数据
[J] 表明我们只修改了一行数据(其它数据块的修改应为undo、redo信息)为了修改一行数据而要搜寻297个数据块。考虑是否需要在查许的列上建一个索引!
第三步 – 查看是否有过量的parse现象
==============================
select …
| call | count | cpu | elapsed | disk | query | current | rows |
|--------- |------ -|--------- |--------- |----- -|------- -|-------- -|------ -|
| Parse | [M] 2 | [N] 221 | 329 | 0 | 45 | 0 | 0 |