你执行update tbname set col='a';
这样很慢?
这样也慢的话增加init.ora中的share_pool_size参数
该参数是库高速缓存和数据字典的告诉缓存,该参数越大,将大大减少ORALCE进行重新分析语法的工作量和管理自身的时间。
这样很慢?
这样也慢的话增加init.ora中的share_pool_size参数
该参数是库高速缓存和数据字典的告诉缓存,该参数越大,将大大减少ORALCE进行重新分析语法的工作量和管理自身的时间。
init.ora
---------------------
shared_pool_size = 102400000
shared_pool_reserved_size = 20000000
向你100万的数据要是一次提交的话,回滚段会不够用的:)
declare
n number;
begin
n:=1;
delete from tb;
loop
update........
n:=n+1;
if mod(n,100)=0 then//每100条提交一次
commit;
end if;
exit when n=500000;//总次数
end loop;
end;
/
set timing on
执行一下看看有多大差别
服务器也不是由我维护的,我只是写程序时碰到了这个问题,速度太慢了!
我一个存储过程居然运行了半个小时~~
数据只有100万
可以用DBMS_SHARED_POOL.KEEP('SCOTT.AA','P');
如果此表经常使用可以把此表放到高速缓存中,ALTER TABLE AA CACHE;
你可以先指定一个大的回滚段,然后在大表的外键建索引.
至于你说的存储过程速度居然比SQLPLUS慢,感觉不可思议.
麻烦把你的过程和sqlplus语句贴上吧.
刚开始我的db_block_size=2048,更新2000条也要花5秒左右。
现在我重建了数据库,db_block_size=16384,更新10000条都没有5秒钟:)
看看你的db_block_size吧
刚开始我的db_block_size=2048,更新2000条也要花5秒左右。
现在我重建了数据库,db_block_size=16384,更新10000条都没有5秒钟:)
看看你的db_block_size吧
而且重构DB_BLOCK_SIZE可以帮你提高这么多的速度,也难以接受。你确保别的条件都一样?看看是不是log swich更不上。这样全表Update的,有索引只会更加慢。我得意见。
在存储过程里面和SQLPlus里面的速度肯定是一样的。
比如给你一个实际测试的例子:
SQL> update usercare set care_date=sysdate
2
SQL> set timing on
SQL> /386221 rows updated.Elapsed: 00:00:37.98
SQL> rollback;Rollback complete.Elapsed: 00:00:23.23
SQL> create or replace procedure t as
2 begin
3 update usercare set care_date=sysdate;
4 end;
5 /Procedure created.Elapsed: 00:00:00.65
SQL> exec tPL/SQL procedure successfully completed.Elapsed: 00:00:35.16
SQL> rollback;Rollback complete.Elapsed: 00:00:23.29