对sql语句的优化问题

本文深入剖析SQL语句执行的各个关键阶段,包括打开游标、解析、执行SQL语句、提取结果及关闭cursor等步骤。详细解释了每个阶段的优化策略,如复用游标、增加缓存、优化数据字典缓存、调整sharedpool和librarycache内存大小等,旨在提高SQL执行效率。同时,文章还讨论了锁等待和日志提交的影响,提供了改善这些问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参照sql例句

Select * from employees where employee_id=100;

Update  employees  set  employee_id =101 where employee_id=3;

优化问题

运行sql语句的时间明显长于之前,需要对整体的操作系统进行优化分析。

思路分析

   (通过对sql语句执行的各个过程进行分析以来查找优化项)

SQL 语句执行过程详细分析

<1> 打开游标cursor

游标cursor在服务器端分配内存以来对sql语句进行缓存区处理(复用游标可以提高性能)。

<2> 解析:

     语法校验:语法校验时不需要SGA,系统服务器进程直接进行处理,有错直接就会显示出来。

     语义校验:语义校验需要数据字典中的信息来支撑(数据字典存有用户信息,用户的权限信息,所有数据对象的结构信息,表的约束条件,统计分析数据库的视图等,数据字典逻辑存放在system表空间中,物理存放在数据文件中)。

在读取表的大量结构信息的时候,因为从磁盘数据文件直接取会导致系统性能缓慢,oracle引入了Data Dictionary Cache 组件以用来在内存中直接缓存数据字典中的信息,避免了系统从磁盘直接读取信息,提高了系统性能。如果Data Dictionary Cache 组件内存很小,或者缓存的信息不是本次所需要的数据,就需要从磁盘读取信息,会直接影响系统性能,此时,适当的增加Shared pool 以便间接的增加Data Dictionary Cache的内存,缓存更多的数据字典信息。(Data Dictionary Cache 组件提高了sql语句解析语义计划的效率)。

生成执行计划:当完成语法,语义校验后,生成执行计划并且缓存到shared pool library cache中以便下一次执行同样的SQL语句时不需要重新执行之前的操作(生成新的执行计划叫硬解析,直接复用之前的执行计划叫软解析)。反复做硬解析CPU浪费很严重,影响系统性能。因此可以通过适当增加library cache的内存大小,查看SQL语句并绑定变量,或者删除不常用的SQL执行计划以来将更多频繁使用的sql语句执行计划缓存到library cache中,以此来提高系统性能。

shared pool 提高了对sql语句解析计划阶段的效率)

<3> 执行SQL语句

为了保证执行效率的提高,需要将数据从磁盘上的数据文件缓存到DataBase buffer cache中,直接从内存中对表进行操作,(执行阶段需考虑全盘扫描和走索引不同的情况,当有大量重复数据时全盘扫描比较快,当数据分布不均匀时索引比较快),在DataBase buffer cache中创建keep池,recycle池,default池(keep池用来缓存那些经常会被访问的表,并且使用的缓冲区独立于DEFAULT池和recycle池,平时要适当减少keep池的内存分配,使keep池的命中率维持在接近100%的数值。Recycle池用来保存那些不希望保存在内存中的表。一般没有细化内存分配时,系统默认只有一个default池。)

<4>提取结果并保存

     因为最终的结果是要通过net网络返回到应用服务器(客户服务端)上,所以如果网络出现问题,同样会导致用户执行sql语句时返回结果的性能降低。

     sqlprocess提取结果并把最终结果返回给客户端时,如果面临order by 排序时,将要进行PGA sort内存排,如果数据量很大,PGA不能满足内存排所需空间时,就需要与磁盘上的临时表空间进行存储分配交换,这个磁盘分配交换将要对临时文件频繁进行写和读,因为对磁盘频繁操作,导致系统性能大大降低。此时,需要将PGA优化,如果不得不使用临时文件时,就需要创建多个临时文件,并发降低读写压力,以达到优化效果。

<5>close cursor

     频繁对cursor进行开,关操作会降低游标的复用能力,降低系统性能。(找平衡点)

 

锁等待也可能是导致sql语句执行性能降低的一个原因,所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml操作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行操作的时候会等待a提交或是回滚后,才可以继续b的操作。当一个用户a进行ddl或者dml操作却没提交或者回滚,用户b对相同行进行操作就会一直等待用户a提交或者回滚,导致sql语句执行时间增长。

当对表进行DML操作时:

<1><2>解析执行如上所示;

<3> 执行SQL语句

      为了保证修改数据的动作能够被数据库恢复过来,引入了redo机制,如果redo信息足够多时,当系统频繁向磁盘写入日志文件时就容易导致系统性能低下,降低整个数据库的运行效率,因此为了提高日志提交效率,引入了Redolog buffer cache组件。当发现问题为日志文件时,应该适当增加Redolog buffer cache的内存,redo file的大小和日志文件组以来优化dml操作的性能问题。

<4><5>如上

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29366942/viewspace-1062236/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29366942/viewspace-1062236/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值