1.插入
1.1建立一张临时表
CREATE table t_sequence_num1(
sequenceNum number(8) not null
)
1.2插入临时表数据
1.3执行插入数据 *** 作
2.更新一百万条数据
总结:插入100万数据大概20s左右,更新100万数据,用like语法,使用时间大概2分钟左右,此处用like是确实只有这个条件可以查询出需要更新的数据,暂时没有想到其他比较好的方法
可用两种方法,一种是在oracle的系统表中统计,另一种需要写存储过程统计,方法分别如下。
1、系统表中统计:
1SELECT sum(num_rows) FROM user_tables结果:
2、存储过程统计,代码如下:
declarev_tName varchar(50)v_sqlanalyze varchar(500)v_num numberv_sql varchar(500)cursor c1 isselect table_name from user_tablesbeginopen c1loopfetch c1 into v_tNameif c1%found then v_sqlanalyze :='analyze table '||v_tName||' estimate statistics'execute immediate v_sqlanalyzev_sql := 'select NUM_ROWS from user_tables where table_name =upper('''||v_tName||''')' execute immediate v_sql into v_numdbms_output.put_line('表名: '||v_tName||' 行数: '||v_num)elseexitend ifend loopend
统计结果:
首先要区分具体情况,虽然表里有几百万几千万的数据量,但是update是同时update这几百万条的数据呢?还是只更新其中某几条? 更新的数据量不同,解决方案自然也就有差异。同时update几百万数据,这个sql的性能影响在于数据库会做回滚段,以便异常时rollback。由于数据量大,性能就浪费在回滚段上了。 所以有2个方案供参考:1. update时 ,禁用回滚段的生成,跟你前面说的nologing应该是一个意思
2. 分批更新,比如每更新10W条数据,就执行一次commit,这样效率也会比原来的要快。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)