update语句执行非常慢(提高update执行速度的方法)
大家好,如果您还对update语句执行非常慢不太了解,没有关系,今天就由本站为大家分享update语句执行非常慢的知识,包括提高update执行速度的方法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
关于Oracle执行update语句突然变慢的问题
Oracle执行update语句突然变慢,最常见的原因是长时间等待锁,可通过查询锁信息并处理高CTIME值的锁来缓解问题。具体分析如下:
问题根源:在C/S结构的应用系统中,数据库执行update语句突然变慢,多数情况下是由于长时间等待锁导致的。锁是数据库中用于控制并发访问的机制,当多个会话同时尝试修改同一数据时,可能会出现锁等待或死锁情况,进而影响数据库性能。
查询锁信息:为确定是否存在锁等待问题,可使用提供的SQL语句查询系统中的锁信息。该语句从多个视图(如v$session、v$lock、v$locked_object、dba_objects、v$process、v$instance)中获取数据,展示会话的用户名、SID、SERIAL#、锁类型、占用的模式、请求的模式、对象名、对象所有者、对象类型、资源ID、CTIME(锁等待时间,单位为秒)等关键信息。
关键指标分析:
CTIME值:CTIME表示锁等待的时间,单位为秒。CTIME值特别高的锁,可能已经无法自动释放,是导致数据库变慢的主要原因。
锁类型与模式:通过DECODE函数,将锁的占用模式和请求模式转换为易读的字符串(如'No Lock'、'Row Share'、'Row Exclusive'等),有助于理解锁的当前状态和请求状态。
处理高CTIME值的锁:
分析锁状态:针对CTIME值特别高的锁,分析其锁类型、占用的模式、请求的模式以及关联的对象,确定是否为死锁或长时间无法释放的锁。
杀掉锁会话:若确认锁无法自动释放,可考虑杀掉该锁对应的会话来缓解数据库变慢的问题。SQL查询结果中已提供了杀掉会话和进程的语句,包括:ALTER SYSTEM KILL SESSION:用于杀掉Oracle会话,格式为ALTER SYSTEM KILL SESSION'sid,serial#'。
Kill Process(Unix/Linux):用于在Unix/Linux系统上杀掉进程,格式为kill-9 spid。
Kill Process(Windows):用于在Windows系统上杀掉Oracle进程,格式为orakill instance_name spid。
预防措施:
优化事务设计:避免长时间运行的事务,减少锁的持有时间。
合理使用索引:确保update语句使用的索引有效,减少全表扫描导致的锁竞争。
监控与预警:建立数据库监控机制,及时发现并处理锁等待问题。
如何提高Oracle大数据表Update效率
ORACLE中如果表数据量很大(M级或更大),update某个字段是很慢的(如我的HIS项目中更新历史业务流程表,160万条记录,用CURSOR来更新,1000条COMMIT一次,花了4天也没更新完),后来尝试过的改进办法有:
1.把表上的LOGGING取消
2.把表上的INDEX取消
但是依然很慢,无奈下找到这个:
在这个主题问答里,ORA官方提了一种处理的办法:
1.利用CREATE table as select xxxxx的办法来生成一新表T1
2.在T1上创建与目标表一样的索引
3.把目标表删除或RENAME(注意备份以备反悔)
4.把T1改名成目标表
试了一下,果然非常地快,我的任务差不多在2Min就完成了。
如csywdk.table_room是一张大表,要删除其中bakfwid在noNewYWFW20081205中的记录,且要更新bakfwid在imp_table_room中记录的ROOM_LOC为imp_table_room.room_loc:
(1)创建新表
create table tmp_new_table_room081205 as
select t1.ROOM_ID,t1.NEWROOMID,t1.BUILDID,t1.TFH,t1.DKH,t1.BUILD_NO,t1.LAYER_NO,t1.ROOM_NO,t1.ROOM_NAME,
decode(t2.bakfwid,null,t1.ROOM_LOC,t2.room_loc)
t1.ROOM_AREA,
t1.SURTYPE,t1.LAYER_NAME,t1.DEVDEP,t1.CELL,t1.DELFLAG,t1.QXXZ,t1.SJSJLSH,t1.FD,t1.ID,t1.BAKFWID
from csywdk.table_room t1 left join imp_table_room t2 on t1.bakfwid=t2.bakfwid
where not exists(select 1 from noNewYWFW20081205 t3 where t3.bakfwid=t1.bakfwid)
(2)创建备份表
create table Table_room081205 as
select* from csywdk.table_room
(3)替换原表
drop table sde.table_room
create table sde.table_room as
select* from tmp_new_table_room081205
在这个问答里还提到一句ORA PL/SQL效率相关的话:
“能用一句语句处理的任务决不要用多句编程来实现”。
原来老是怕一句执行时,回滚段不够大,看来只能准备好硬盘为上策了
oracleSQL执行缓慢的分析
问题描述
oracle数据库中一张表的数据已经亿多而且此表创建了个独立的索引由于业务需要每天需分两次向此表中插入万条记录由于数据量大每次插入耗时个小时以上严重影响效率因此修改了系统的算法将此表中只存储当天新增记录将此表truncate后第二天执行对此表的update操作时非常耗时表中有亿多条数据的时候此sql语句耗时秒表中有万条数据的时候此sql语句耗时几个小时咨询DBA后得出结论需重建索引重建后秒完成此操作但第三天问题依然出现 DBA正在查找原因难道每次truncate表都需要重建索引?
对于这个问题 DBA也没有给出合理的解释推测主要原因是oracle复杂的查询优化算法
最终 DBA给出的解决方案
truncate table
drop index
insert data
create index
*** yze table table_name pute statistics;//重新生成统计数据
lishixinzhi/Article/program/Oracle/201311/16938
文章分享结束,update语句执行非常慢和提高update执行速度的方法的答案你都知道了吗?欢迎再次光临本站哦!