Plsql 执行update或者delete时卡死

本文介绍了一种在使用Oracle PL/SQL Developer时遇到的问题,即执行UPDATE或DELETE操作时程序卡死。文章分析了可能的原因,并提供了解决方案,包括如何查询锁定记录和解除锁定。

oracle Plsql 执行update或者delete时遇到过Plsql卡死问题或者导致代码执行sql的时候就卡死。

在开发中遇到此问题的时候,本来把sql复制出来,在plsql中执行,Sql本身拼写无误,但是出现plsql卡死的情况,

在代码中,执行sql的地方打断点debug,发现执行sql,仍然没有响应。经过网上查资料,猜测导致这种情况的原因是可能在PLSQL Developer执行update时没有commit,oracle将该条记录锁住了。

可以通过以下办法解决: 

先查询锁定记录 

SELECT s.sid,s.serial#FROM v$locked_object lo,dba_objects ao, v$session sWHERE ao.object_id = lo.object_idAND lo.session_id = s.sid; 

 

备注(查询结果若有返回sidserial#组成的表结果,将对应的sidserial#带入下面的sql语句删除锁定记录,返回多少行,就要对应执行多少句下面的sql语句即可

例:ALTERsystemKILLsession'78,136';

 

ALTERsystemKILLsession'SID,serial#';

在使用 PL/SQL 执行 Oracle SQL ,当数据量过大导致执行卡死的情况,通常涉及多个方面的性能瓶颈和配置问题。以下是些有效的解决方案和优化方法: ### 1. **优化 SQL 语句** - 确保 SQL 语句本身是高效的,避免全表扫描和不必要的数据操作。可以通过添加索引、优化查询条件和减少子查询嵌套等方式提高查询效率。 - 使用 `EXPLAIN PLAN` 来分析 SQL执行计划,确保查询路径是最优的。 ### 2. **批量处理与分批次执行** - 对于大规模数据操作,可以将任务拆分为较小的批次。例如,通过 `ROWNUM` 或 `ROWID` 对数据进行分段处理,避免次性操作过多数据。 - 使用 `FORALL` 和 `BULK COLLECT` 语句来提高 PL/SQL 中批量数据处理的性能,减少上下文切换带来的开销。 ### 3. **使用绑定变量** - 在 PL/SQL执行 SQL ,尽量使用绑定变量而不是直接拼接值。这样可以减少硬解析的次数,提高执行效率,并减少共享池的内存消耗。 ### 4. **调整数据库参数** - 增加 `PGA_AGGREGATE_TARGET` 和 `SGA_TARGET` 的值,以提供更多的内存资源给数据库进程。 - 调整 `SORT_AREA_SIZE` 和 `HASH_AREA_SIZE` 等与排序和哈希操作相关的参数,以提升处理大数据量的性能。 ### 5. **使用 PL/SQL Developer 工具优化** - 避免直接在 PL/SQL Developer 的 GUI 界面中执行大规模 SQL 语句。可以将 SQL 保存为 `.sql` 文件,并通过命令行或脚本方式执行。 - 使用 `@ 文件路径\文件名.sql` 的方式批量执行 SQL 文件,减少工具本身的性能负担[^2]。 ### 6. **事务控制** - 在执行大规模操作,合理使用事务提交。如果不需要次性提交所有操作,可以在每个批次完成后提交事务,避免事务日志过大导致性能下降。 - 如果文件中没有提交语句,需要手动添加 `COMMIT`,否则可能导致事务堆积,进而影响性能。 ### 7. **索引管理** - 在执行大规模插入或更新操作之前,可以考虑暂禁用相关表的索引,在操作完成后再重新启用并重建索引。这样可以显著减少 I/O 操作和锁竞争。 ### 8. **并行处理** - 对于支持并行操作的 Oracle 数据库版本,可以启用并行查询或并行 DML 操作,利用多核 CPU 资源加速数据处理。 ### 示例代码:分批次更新数据 ```sql DECLARE CURSOR c_data IS SELECT * FROM large_table WHERE processed_flag = 'N'; TYPE t_data IS TABLE OF large_table%ROWTYPE INDEX BY PLS_INTEGER; v_data t_data; BEGIN OPEN c_data; LOOP FETCH c_data BULK COLLECT INTO v_data LIMIT 1000; -- 每次取1000条 FORALL i IN 1..v_data.COUNT UPDATE large_table SET processed_flag = 'Y' WHERE id = v_data(i).id; COMMIT; -- 每批提交次事务 EXIT WHEN c_data%NOTFOUND; END LOOP; CLOSE c_data; END; ``` ### 9. **监控与诊断** - 使用 Oracle 的性能视图(如 `V$SESSION`, `V$SQL`, `V$PROCESS` 等)监控当前会话和 SQL 执行状态,识别瓶颈。 - 使用 AWR(Automatic Workload Repository)和 ADDM(Automatic Database Diagnostic Monitor)进行性能分析和建议。 ### 10. **升级硬件或数据库版本** - 如果上述优化手段仍无法满足需求,考虑升级硬件(如增加内存、使用 SSD)或升级到更高版本的 Oracle 数据库,以获得更好的性能支持。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值