一:大批量删除数据的脚本
说明:
有两张表a表(2000w数据),b表(30w数据)
b.id肯定能在a.id中找到
删掉a表中b.id和a.id不能匹配的数据
如b.id有1,2,3,4
a.id有1,2,3,4,5,6,7,8
把5,6,7,8在a表中删掉
create or replace procedure DelBatchData(LimitRows number) is
c sys_refcursor;
Type v_rowid is table of varchar2(30) index by binary_integer;
var_rowid v_rowid;
begin
open c for
select rowid
from a s1 where not exists (select 1 from b s2 where s1.id=s2.id);
fetch c bulk collect into var_rowid limit LimitRows;
close c;
forall i in 1..var_rowid.count
delete from a where rowid=var_rowid(i);
commit;
exception
when others then
rollback;
raise_application_error(-20001,sqlerrm);
end;
二:大批量更新数据时(zt)。
详见http://www.itpub.net/thread-1052077-1-3.html
说明:
要更新的表:T1 (id1 number, id2 number, curr_count number,.....) --id1唯一 5亿条记录 >60GB
更新数据来源:T2 (id2 number, curr_count number) --id2唯一 4.8亿
更新逻辑:T2中的每一条记录,都到T1中找到对应的记录(T2.id2=T1.id2),更新T1.curr_count=T2.curr_count
限制条件:只能在线更新(应用程序一直在访问这个表,所以不能用INSERT SELECT)
alter table T1 storage(buffer_pool keep); -- keep buffer pool size = 6GB
declare
cursor cur_t2 is
select /*+ use_hash(T1,T2) parallel(T1,16) parallel_index(IX_T1_id2,16) */
T2.id2, T2.curr_count, T1.rowid row_id
from T1, T2
where T1.id2=T2.id2
order by T1.rowid; v_counter number;
begin
v_counter := 0;
for row_t2 in cur_t2 loop
update T1 set curr_count=row_t2.curr_count
where rowid=row_t2.row_id;
v_counter := v_counter + 1;
if (v_counter>=1000) then
commit;
v_counter := 0;
end if;
end loop;
commit;
end;
/
alter table T1 storage(buffer_pool default);
注:
1。这里速度加快的主要原因是避免了重复读取block
2。进一步加快读取可以用bulk collect
分享到:
相关推荐
通过上述示例代码,我们可以看到如何利用Oracle的游标、BULK COLLECT 和 FOR ALL 结合ROWID来实现高效的大批量数据删除。这种方法不仅大大提高了数据处理的速度,还保证了操作的安全性和可靠性。对于经常需要处理...
综上所述,本文为大数据量删除操作提供了一种有效的解决方案,并证明了使用rowid删除法在Oracle数据库中的最优效率。文章的主要贡献在于:1) 证明了使用rowid进行大数据量删除操作可以达到最优的性能表现;2) 提出了...
在实际工作中,数据库中的数据可能会因为各种原因而出现重复,例如数据录入错误、批量导入数据时的疏忽等。这些重复数据的存在不仅会占用不必要的存储空间,还可能导致数据分析结果失真。因此,了解并掌握如何有效地...
- **批量删除重复行**: 在存在重复数据的情况下,利用ROWID和子查询,可以批量删除除最大ROWID之外的所有重复行,例如`SQL> delete tname o where o.rowid <> (select max(rowid) from tname i where i.colname = o....
利用ROWID进行删除操作比使用普通列更快,因为它直接指向了数据块的位置。 ```sql DELETE FROM employees e WHERE e.rowid > (SELECT MIN(x.rowid) FROM employees x WHERE x.emp_no = e.emp_no); ``` 这段代码将...
8. **高效删除记录**:利用ROWID进行条件筛选,实现精准的记录删除,可以避免全表扫描,提高删除操作的效率。 #### TRUNCATE与DELETE的区别 9. **TRUNCATE与DELETE的对比**:TRUNCATE命令用于清空整个表的数据,...
2. **ROWID访问**:利用ROWID这一特殊的标识符,可以直接定位到特定的记录位置。ROWID包含着记录在物理存储中的位置信息,通过索引来实现数据与其物理位置之间的关联,从而提高访问效率。 #### 四、SQL对表与索引的...
综上所述,在Oracle数据库的学习过程中,理解如何利用索引来优化查询性能、如何处理重复数据以及如何实现高效的数据分页是非常重要的。这些技巧不仅有助于提高系统的整体性能,也能在面试和技术交流中展示出扎实的...
3. **数据更新**:使用`UPDATE`语句可以修改表中的数据。 - 示例:`UPDATE ARTISTS SET T_ID = 15;` 4. **查看表结构**:使用`DESCRIBE`命令可以显示表的结构信息。 5. **SQL*Plus命令**: - `GET`命令:将文件...
在使用jqGrid处理异步加载服务器数据的场景时,可能会遇到一个问题:当用户在表格中选中一些记录后翻页,再回到原来的页面,之前选中的记录会丢失,无法进行批量操作,比如批量删除。这是因为每次翻页或执行搜索时,...
7. **删除重复记录**:使用ROWID可以高效地删除重复记录,避免全表扫描。 8. **使用TRUNCATE替代DELETE**:对于整个表的清理,TRUNCATE命令比DELETE更快,因为它不涉及回滚段,资源消耗少。 9. **频繁使用COMMIT**...
8. **删除重复记录**:使用 ROWID 进行删除操作,例如使用 DELETE 语句结合子查询,可以高效地去除重复记录。 9. **使用 TRUNCATE 替换 DELETE**:TRUNCATE 命令用于清空表,其速度快于 DELETE,因为不涉及回滚段,...
在删除记录时,可以利用ROWID快速定位并删除行。例如,使用ROWID进行子查询,找到需要删除的最小ROWID,然后基于该ROWID进行删除操作。这种方式可以显著提高删除操作的速度。 #### 9. TRUNCATE与DELETE的区别 `...
8. **高效删除重复记录**:使用ROWID进行删除,例如通过子查询找到最小ROWID保留一条记录,其他重复记录则删除。 9. **使用TRUNCATE替代DELETE**:当需要删除整个表时,使用TRUNCATE而非DELETE,前者不涉及回滚段,...
8. **删除重复记录**:使用ROWID进行删除操作可以更高效,因为它直接定位到特定记录,而不是遍历整个表。 9. **使用TRUNCATE替代DELETE**:当需要清空表时,TRUNCATE命令更快,因为它不涉及回滚段,且不保留可恢复...
合理的设置可以显著提升批量数据处理的速度。 DECODE函数是一个实用的工具,它能减少重复扫描和连接,通过在查询中直接处理逻辑判断,降低处理时间。 对于简单无关联的数据库访问,可以通过一次查询合并多个独立的...
- 利用ROWID直接定位到特定行的位置。 - 这种方式比全表扫描效率更高,尤其是在大数据量的情况下。 3. **索引访问**: - 通过索引找到所需数据的ROWID,然后使用ROWID快速定位到具体的数据行。 - 适用于需要...
8. **删除重复记录**:使用ROWID进行删除可以高效地去除重复,而不必扫描整个表。 9. **使用TRUNCATE替代DELETE**:删除大量数据时,TRUNCATE操作更快,因为它不涉及回滚段,但只能用于清空整表,且不可撤销。 10....
4. 使用索引:创建和维护适当的索引可以显著提升查询速度,但过多的索引可能导致插入、更新和删除操作变慢,因此需要平衡。 5. 避免全表扫描:尽可能使用索引,避免在WHERE子句中使用NOT IN、!=、等操作符,因为...
- **批量数据操作**:使用SQL*Loader等工具进行大批量数据导入导出。 #### 第十四章 约束 - **约束类型**:PRIMARY KEY、FOREIGN KEY、UNIQUE等约束类型及其作用。 - **约束管理**:创建、启用、禁用、删除约束的...