Oracle体系结构之SQL语句的执行过程

简介:

一般来说,数据库处理SQL都会经过三个过程:解析(parse)、执行(exec)、返回结果(fetch)

1.解析

当用户发起一个SQL语句时,Oracle通过Server Process 接收SQL语句到达oracle实例,并在Shared pool 中的 Library Cache 查找是否存在该语句对应执行计划的缓存。

如果不存在则将该SQL进行硬解析(Hard parse),生成最优化的执行计划(plan),并将该执行计划等信息载入Library Cache。

如果存在则不经过硬解析,而是直接进行软解析(Soft parse),从而减少数据库的分析时间。

2.执行

server process首先在buffer cache中查找是否存在该执行计划所对应的数据块,如果存在,就直接进行DML操作(逻辑IO),否则应从数据文件中将数据块读取到buffer cache中,再进行DML操作(物理IO)。

3.返回结果

对于SELECT语句需要返回结果,首先看是否需要排序,如果需要则排序后返回给用户。

对于其他DML语句(insert/delete/update),则无需返回结果。当buffer cache中的数据块被修改时,server process将自动记录buffer的改变过程到SGA中的redo log buffer,最终分别由DBWR和LGWR进程负责将buffer cache中的脏数据块和redo log buffer中的日志写到磁盘中的data file和redo log file。


解析类型:硬解析、软解析、软软解析

对SQL的解析都需要频繁地访问数据字典

硬解析

判断SQL语句是否存在语法、语义的问题

判断SQL语句所涉及的对象(表、视图)是否存在

判断执行SQL语句的用户对涉及的对象是否有权限

选择最优的执行方案,生成执行计划

其中生成执行计划最消耗系统资源(CPU、I/O、Memory),尤其是CPU和I/O资源

软解析:只判断SQL语句的语法、语义、对象权限,而不生成执行计划

软软解析:不解析

1
2
3
4
5
6
7
8
9
SQL>  select  name ,value  from  v$sysstat  where  name  like  'parse%'  ;
NAME                                 VALUE
------------------------------ ----------
parse  time  cpu                       1339
parse  time  elapsed                  17374
parse  count  (total)                 23639
parse  count  (hard)                   3060
parse  count  (failures)                149
parse  count  (describe)                  9


命中率:

命中率在Oracle数据库的多个地方都会被提起

例如当一个进程需要访问数据时,首先确定数据是否存在Buffer Cache中,如果存在(称为高速缓存命中),则直接读取数据(逻辑IO/内存读);如果不存在(称为高速缓存未命中),则需要在Buffer Cache中寻找足够的空间将磁盘上需要的数据块复制到Buffer Cache中(物理IO/硬盘读)。

命中率=逻辑IO/(逻辑IO+物理IO)*100%

注:如果命中率低肯定有问题,但命中率高不一定没问题(逻辑IO远高于物理IO,但物理IO仍旧很高的情况下)

可以通过操作系统命令vmstat、iostat查看当前系统的IO情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[oracle@ora11g ~]$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
  r  b   swpd    free    buff  cache   si   so    bi    bo    in    cs us sy  id  wa st
  1  0      0 374572  25260 788168    0    0   262    34  239  253  1  4 80 16  0
  2  0      0 374556  25268 788172    0    0     0    36  909 1341  0  1 99  0  0
  0  0      0 374556  25268 788172    0    0     0     0  876 1248  0  1 99  0  0
  0  0      0 374556  25268 788172    0    0    16    80  974 1495  0  1 99  0  0
  0  0      0 374556  25276 788164    0    0     0    48  966 1428  0  1 99  0  0
[oracle@ora11g ~]$ iostat 1 5
Linux 2.6.18-308.el5 (ora11g.example.com)       07 /17/2013
avg-cpu:  %user   % nice  %system %iowait  %steal   %idle
            1.00    0.00    3.85   15.19    0.00   79.96
Device:            tps   Blk_read /s    Blk_wrtn /s    Blk_read   Blk_wrtn
sda              33.72      1551.26       202.49    1052263     137352
sda1              0.10         2.58         0.01       1749          4
sda2             22.27      1256.66       141.92     852432      96271
sda3              0.07         2.37         0.00       1610          0
sda4              0.01         0.02         0.00         11          0
sda5              2.17        58.06         4.54      39382       3080
sda6              2.40        60.32        15.53      40920      10532
sda7              2.85        77.55        16.47      52605      11173
sda8              3.01        76.16         8.77      51663       5949
sda9              0.80        17.03        15.25      11554      10343
avg-cpu:  %user   % nice  %system %iowait  %steal   %idle
            0.00    0.00    0.55    0.00    0.00   99.45
Device:            tps   Blk_read /s    Blk_wrtn /s    Blk_read   Blk_wrtn
sda               5.00        32.00       128.00         32        128
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              1.00         0.00        32.00          0         32
sda7              2.00        32.00        32.00         32         32
sda8              1.00         0.00        32.00          0         32
sda9              1.00         0.00        32.00          0         32
avg-cpu:  %user   % nice  %system %iowait  %steal   %idle
            0.26    0.00    0.77    0.26    0.00   98.71
Device:            tps   Blk_read /s    Blk_wrtn /s    Blk_read   Blk_wrtn
sda               2.00         0.00       104.00          0        104
sda1              0.00         0.00         0.00          0          0
sda2              2.00         0.00       104.00          0        104
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              0.00         0.00         0.00          0          0
sda7              0.00         0.00         0.00          0          0
sda8              0.00         0.00         0.00          0          0
sda9              0.00         0.00         0.00          0          0
avg-cpu:  %user   % nice  %system %iowait  %steal   %idle
            0.26    0.00    0.26    0.00    0.00   99.48
Device:            tps   Blk_read /s    Blk_wrtn /s    Blk_read   Blk_wrtn
sda               4.00         0.00        32.00          0         32
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              1.00         0.00         8.00          0          8
sda6              1.00         0.00         8.00          0          8
sda7              1.00         0.00         8.00          0          8
sda8              0.00         0.00         0.00          0          0
sda9              1.00         0.00         8.00          0          8
avg-cpu:  %user   % nice  %system %iowait  %steal   %idle
            0.00    0.00    0.78    0.00    0.00   99.22
Device:            tps   Blk_read /s    Blk_wrtn /s    Blk_read   Blk_wrtn
sda              13.00       160.00       208.00        160        208
sda1              0.00         0.00         0.00          0          0
sda2              4.00         0.00        80.00          0         80
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              1.00         0.00        32.00          0         32
sda7              3.00        64.00        32.00         64         32
sda8              4.00        96.00        32.00         96         32
sda9              1.00         0.00        32.00          0         32

也可以通过v$buffer_pool_statistics视图查看命中率的情况

1
2
3
4
SQL>  SELECT  NAME , PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,(1-(PHYSICAL_READS/(DB_BLOCK_GETS+CONSISTENT_GETS)))*100  "Hit Ratio"       FROM  V$BUFFER_POOL_STATISTICS  WHERE  NAME = 'DEFAULT' ;
NAME                  PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS  Hit Ratio
-------------------- -------------- ------------- --------------- ----------
DEFAULT                        12786         14986          158305 92.6216595




          本文转自Vnimos51CTO博客,原文链接:http://blog.51cto.com/vnimos/1251480 ,如需转载请自行联系原作者


相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
228 8
|
7月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
270 6
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
10月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
3121 11
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
1494 6
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
505 13

推荐镜像

更多