news 2026/4/18 12:36:17

巧用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/4/18 6:43:35

SAP PS网络成本计划实战:从配置到报表分析全解析

1. SAP PS网络成本计划的核心价值 第一次接触SAP PS模块的网络成本计划功能时&#xff0c;我完全被它的自动化能力震撼到了。想象一下&#xff0c;你只需要维护好基础数据&#xff0c;系统就能自动帮你计算出整个项目的计划成本&#xff0c;这比手工在Excel里折腾公式要靠谱多…

作者头像 李华
网站建设 2026/4/18 6:40:05

小白必看!Z-Image Turbo防黑图技巧大公开

小白必看&#xff01;Z-Image Turbo防黑图技巧大公开 1. 为什么你的图总是一片黑&#xff1f;真相可能让你意外 你是不是也遇到过这样的情况&#xff1a; 刚装好 Z-Image Turbo&#xff0c;满怀期待输入提示词&#xff0c;点击生成——结果画面全黑&#xff0c;或者直接报错 …

作者头像 李华
网站建设 2026/4/17 15:08:39

树莓派也能跑!Qwen3-0.6B边缘计算新玩法

树莓派也能跑&#xff01;Qwen3-0.6B边缘计算新玩法 1. 导语&#xff1a;当大模型“瘦身”到树莓派上&#xff0c;AI真的开始落地了 你有没有试过在树莓派上跑大模型&#xff1f;不是“能跑”&#xff0c;而是“跑得稳、答得准、用得顺”——这次&#xff0c;Qwen3-0.6B做到了…

作者头像 李华
网站建设 2026/4/18 8:42:00

Qwen3-TTS开源镜像快速上手:支持RTSP流式输出的实时语音交互场景适配

Qwen3-TTS开源镜像快速上手&#xff1a;支持RTSP流式输出的实时语音交互场景适配 1. 这不是“又一个TTS”&#xff0c;而是能真正跑在边缘设备上的实时语音引擎 你有没有试过这样的场景&#xff1a;在智能硬件设备上部署语音合成&#xff0c;结果一开口就卡顿、延迟高、声音生…

作者头像 李华
网站建设 2026/4/17 15:51:53

如何为GPT-OSS-20B添加图像理解能力?路径分析

如何为GPT-OSS-20B添加图像理解能力&#xff1f;路径分析 你刚在本地部署好 gpt-oss-20b-WEBUI 镜像&#xff0c;双卡4090D嗡嗡作响&#xff0c;网页界面清爽打开——输入“请总结这篇论文”&#xff0c;响应秒出&#xff1b;但当你拖入一张电路板照片&#xff0c;点击发送&am…

作者头像 李华
网站建设 2026/4/18 1:58:14

持续集成/持续部署(CI/CD) for Python

SQLAlchemy是Python中最流行的ORM&#xff08;对象关系映射&#xff09;框架之一&#xff0c;它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华