news 2026/6/9 23:47:00

巧用rowid批量操作数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
巧用rowid批量操作数据

1、rowid简介

索引组织表:有且仅有一个聚簇索引键,数据按照聚簇索引键排序,所以数据是有序的,插入也是有序的。项目中一般情况下主键是非聚集索引,因此rowid是有序且是聚集索引,因此有些大表dml操作可以借用rowid去批量做来提升性能。

2、案例

项目中有些表经常查询,并且已增量很多数据,需要对比过去时间的数据进行归档,利用rowid可以加快数据归档的速度

2.1 测试数据准备

create table base1(idvarchar2(20)primary key,project_idvarchar2(20),ptypevarchar2(20),dflag int,ctime timestamp)partition bylist(ptype)(partition p_1values('1'),partition p_2values('2'),partition p_3values('3'),partition p_4values('4'),partition p_5values('5'),partition p_6values('6'),partition p_7values('7'),partition p_8values('8'),partition p_9values('9'));insert into base1 select'A'||level,'A'||to_char(round(dbms_random.value(1,10000),0)),to_char(round(dbms_random.value(1,9),0)),round(dbms_random.value(1,1),0),sysdate-round(dbms_random.value(1,360),0)from dual connect by level<=1000000;commit;insert into base1 select'A'||level+1000000,'A'||to_char(round(dbms_random.value(1,10000),0)),to_char(round(dbms_random.value(1,9),0)),round(dbms_random.value(1,1),0),sysdate-round(dbms_random.value(1,360),0)from dual connect by level<=1000000;commit;insert into base1 select'A'||level+2000000,'A'||to_char(round(dbms_random.value(1,10000),0)),to_char(round(dbms_random.value(1,9),0)),round(dbms_random.value(1,1),0),sysdate-round(dbms_random.value(1,360),0)from dual connect by level<=1000000;commit;备份表 create table BAK_base1(idvarchar2(20)primary key,project_idvarchar2(20),ptypevarchar2(20),dflag int,ctime timestamp)partition bylist(ptype)(partition p_1values('1'),partition p_2values('2'),partition p_3values('3'),partition p_4values('4'),partition p_5values('5'),partition p_6values('6'),partition p_7values('7'),partition p_8values('8'),partition p_9values('9'));create table BAK_base2(idvarchar2(20)primary key,project_idvarchar2(20),ptypevarchar2(20),dflag int,ctime timestamp)partition bylist(ptype)(partition p_1values('1'),partition p_2values('2'),partition p_3values('3'),partition p_4values('4'),partition p_5values('5'),partition p_6values('6'),partition p_7values('7'),partition p_8values('8'),partition p_9values('9'));

2.2 使用rowid方式/直接插入方式性能对比

将小于2026-01-01的数据插入新的备份表中。

2.2.1 Rowid方式
declare v_sqlvarchar(2000);v_pageno bigint;v_operate_num_max bigint;v_operate_num_min bigint;v_size bigint;cursor cur is select partition_name from dba_tab_partitions where table_name='BASE1';BEGINv_pageno:= 100000;-- 10万条数据循环一次 DBMS_OUTPUT.PUT_LINE(v_pageno);for c in cur loop execute immediate'select SF_GET_REAL_ROWID(max(rowid)), SF_GET_REAL_ROWID(min(rowid)) from BASE1_'||c.partition_name into v_operate_num_max,v_operate_num_min;v_size:=ceil((v_operate_num_max - v_operate_num_min)/(v_pageno-1))+1;for i in 1..v_size loopv_sql:='insert into bak_base1 select * from base1_'||c.partition_name||' where ctime<to_date(''2026-01-01'',''yyyy-mm-dd'') and rowid >= '||v_operate_num_min+(i-1)*v_pageno||' and rowid < '||v_operate_num_min+i*v_pageno;execute immediate v_sql;commit;end loop;end loop;END;执行时间: 执行成功,执行耗时47秒 532毫秒.执行号:4545 100000 影响了0条记录 1条语句执行成功
2.2.2 直接插入
create index IDX_DM_BASE1 onBASE1(CTIME)global;insert into bak_base2 select * from base1 where ctime<to_date('2026-01-01','yyyy-mm-dd');commit;[执行语句1]:insert into bak_base2 select * from base1 where ctime<to_date('2026-01-01','yyyy-mm-dd');执行成功,执行耗时9分 2秒 93毫秒.执行号:4633 影响了2,745,322条记录

对比,rowid方式完胜

3、小结

(1)rowid是聚集索引,通过rowid方式获取数据批量操作可以提升性能。目前也在实际项目中使用。
(2)一次性操作大量数据,也会产生很多undo记录,此时发生宕机,重启就要重做redo,可能要回滚很久。因此化整为零,并且每次用到rowid的聚集索引特性,能够快速达到目的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 7:48:58

学生党也能玩转大模型!Hunyuan-MT-7B-WEBUI入门指南

学生党也能玩转大模型&#xff01;Hunyuan-MT-7B-WEBUI入门指南 你是不是也经历过这些时刻&#xff1a; 写论文查外文资料&#xff0c;复制粘贴进翻译网站&#xff0c;结果专业术语全翻错了&#xff1b;帮少数民族同学看维吾尔语通知&#xff0c;靠截图多个APP来回切换&#…

作者头像 李华
网站建设 2026/6/6 7:03:13

StructBERT中文情感分析镜像发布|CPU友好+开箱即用的WebUI与API

StructBERT中文情感分析镜像发布&#xff5c;CPU友好开箱即用的WebUI与API 1. 为什么你需要一个真正能跑在CPU上的中文情感分析工具&#xff1f; 你是不是也遇到过这些情况&#xff1a; 想快速验证一段用户评论的情绪倾向&#xff0c;但手头没有GPU服务器&#xff0c;本地笔…

作者头像 李华
网站建设 2026/6/6 6:45:41

C++中的类型标签分发

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/6/6 7:55:00

告别复杂配置:Qwen2.5-7B微调镜像开箱即用体验分享

告别复杂配置&#xff1a;Qwen2.5-7B微调镜像开箱即用体验分享 你是否也曾面对大模型微调望而却步&#xff1f;不是卡在环境搭建&#xff0c;就是困于依赖冲突&#xff1b;不是被CUDA版本折磨&#xff0c;就是被ms-swift、peft、transformers的版本组合绕晕&#xff1b;更别说…

作者头像 李华
网站建设 2026/6/7 16:00:48

Ollama镜像免配置实战:translategemma-27b-it图文翻译效果惊艳呈现

Ollama镜像免配置实战&#xff1a;translategemma-27b-it图文翻译效果惊艳呈现 1. 这不是普通翻译模型&#xff0c;是能“看图说话”的双模态翻译专家 你有没有遇到过这样的场景&#xff1a; 一张产品说明书截图全是中文&#xff0c;但客户急着要英文版&#xff1b; 朋友圈里…

作者头像 李华
网站建设 2026/6/5 13:53:47

模板代码跨编译器兼容

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…

作者头像 李华