问题描述
我正在为开发人员构建沙箱Oracle数据库。我需要使用 “真实” 姓名,以掩盖员工姓名,从属姓名和紧急联系人姓名。
掩蔽HR.EMP_DEP_BEN_NAME花费了7个多小时的60,000行。
你能帮我调整光标,还是我应该采取不同的方法,不使用dbms_random.vlaue?
任何帮助将不胜感激。
-----------------------------------------
-- drop table HR.EMPLOYEES_TEST;
创建表HR.EMPLOYEES_TEST
(雇员id号码 (6,0),
FIRST_NAME VARCHAR2(20字节),
最后名称VARCHAR2(25字节),
电子邮件VARCHAR2(25字节),
名称 _ 显示VARCHAR2(50字节),
名称 _ 正式VARCHAR2(50字节),
名称VARCHAR2(50字节),
联系人名称VARCHAR2(50字节)
);
---- 插入测试数据 ---
插入到人力资源。员工测试
值 (101,'Neena','Kochhar','NKOCHHAR','Neena Kochhar','Neena Kochhar','Kochhar,Neena','Mallin,Jason');
插入到人力资源。员工测试
价值观 (103,'Alexander','Hunold','AHUNOLD','Alexander Hunold','Alexander Hunold','Hunold,Alexander','Chung,kely');
插入到人力资源。员工测试
值 (104,'Bruce','Ernst','BERNST','Bruce Ernst','Ernst','Ernst,Bruce','Cambrault,nanette ');
插入到人力资源。员工测试
值 (106,'Valli','patabala','VPATABAL','Valli patabala','Valli patabala','patabala','patala','Dilly,jenniifer');
插入到人力资源。员工测试
值 (107,'Diana','Lorentz','DLORENTZ','Diana Lorentz','Lorentz','Lorentz,Diana','Sarchand,Nandita');
插入到人力资源。员工测试
值 (109,'Daniel','Faviet','DFAVIET','Daniel Faviet','Faviet,Daniel','Fripp,Adam');
-- DROP TABLE HR.EMP_DEP_BEN_NAME_TEST;
创建表HR.EMP_DEP_BEN_NAME_TEST
(员工身份变量2(11个字符),
名字变量2(30个字符),
最后名称VARCHAR2(30个字符),
MIDDLE_NAME VARCHAR2(30 CHAR));
---- 插入测试数据 ---
插入人力资源。emp_dep_ben_ben_name_test
值 (101,'Alondra','Dominguez','Kadyn');
插入人力资源。emp_dep_ben_ben_name_test
值 (101,“艾默生”,“麦克马洪”,“德里克”);
插入人力资源。emp_dep_ben_ben_name_test
值 (101,“天使”,“巴尔”,“情人节”);
插入人力资源。emp_dep_ben_ben_name_test
值 (103,'Ronnie','Rosario','Sterling');
插入人力资源。emp_dep_ben_ben_name_test
值 (103、 “锡安” 、 “巴克斯特” 、 “本杰明”);
插入人力资源。emp_dep_ben_ben_name_test
价值观 (104,“天使”,“亨德里克斯”,“凯莱”);
插入人力资源。emp_dep_ben_ben_name_test
价值观 (104,'Alexandria','Perkins','Alanna');
插入人力资源。emp_dep_ben_ben_name_test
值 (104,'Zain','Browning','Ava');
插入人力资源。emp_dep_ben_ben_name_test
值 (106,“康纳”,“沃尔夫”,“达拉斯”);
插入人力资源。emp_dep_ben_ben_name_test
值 (109、 “贾斯珀” 、 “韦尔奇” 、 “马龙”);
插入人力资源。emp_dep_ben_ben_name_test
值 (109,'Makayla','Maddox','Phoebe');
插入人力资源。emp_dep_ben_ben_name_test
值 (109,'Kaylen','Melendez','Elena');
-----
-- DROP TABLE HR.dummy_first_name;
-- DROP TABLE HR.dummy_last_name;
创建表HR.dummy_first_name nologging,从HR.Employes_test中选择distinct(first_name);
从HR.Employes_test创建表HR.dummy_last_name nologging作为选择distinct(last_name);
--- 用虚拟名称更新EMP_DEP_BEN_NAME_TEST表。这是60,000行超过7小时的步骤。
将服务器输出设置为
声明
cntr号;
光标c1是
从HR.EMP_DEP_BEN_NAME_TEST中选择rowid;
开始
cntr := 0;
对于c1中的rec
循环
更新HR.EMP_DEP_BEN_NAME_TEST set FIRST_NAME = (选择first_name从hr.dummy_first_name按DBMS_RANDOM.VALUE顺序选择first_name),其中rownum = 1),
LAST_NAME = (从中选择last_name (从hr.dummy_last_name按DBMS_RANDOM.VALUE顺序选择last_name),其中rownum = 1),
MIDDLE_NAME = (从中选择first_name (从hr.dummy_first_name按DBMS_RANDOM.VALUE顺序选择first_name),其中rownum = 1)
其中rowid = rec.rowid;
cntr := cntr 1;
结束循环;
dbms_output.put_line (cntr);
结束;
/
掩蔽HR.EMP_DEP_BEN_NAME花费了7个多小时的60,000行。
你能帮我调整光标,还是我应该采取不同的方法,不使用dbms_random.vlaue?
任何帮助将不胜感激。
-----------------------------------------
-- drop table HR.EMPLOYEES_TEST;
创建表HR.EMPLOYEES_TEST
(雇员id号码 (6,0),
FIRST_NAME VARCHAR2(20字节),
最后名称VARCHAR2(25字节),
电子邮件VARCHAR2(25字节),
名称 _ 显示VARCHAR2(50字节),
名称 _ 正式VARCHAR2(50字节),
名称VARCHAR2(50字节),
联系人名称VARCHAR2(50字节)
);
---- 插入测试数据 ---
插入到人力资源。员工测试
值 (101,'Neena','Kochhar','NKOCHHAR','Neena Kochhar','Neena Kochhar','Kochhar,Neena','Mallin,Jason');
插入到人力资源。员工测试
价值观 (103,'Alexander','Hunold','AHUNOLD','Alexander Hunold','Alexander Hunold','Hunold,Alexander','Chung,kely');
插入到人力资源。员工测试
值 (104,'Bruce','Ernst','BERNST','Bruce Ernst','Ernst','Ernst,Bruce','Cambrault,nanette ');
插入到人力资源。员工测试
值 (106,'Valli','patabala','VPATABAL','Valli patabala','Valli patabala','patabala','patala','Dilly,jenniifer');
插入到人力资源。员工测试
值 (107,'Diana','Lorentz','DLORENTZ','Diana Lorentz','Lorentz','Lorentz,Diana','Sarchand,Nandita');
插入到人力资源。员工测试
值 (109,'Daniel','Faviet','DFAVIET','Daniel Faviet','Faviet,Daniel','Fripp,Adam');
-- DROP TABLE HR.EMP_DEP_BEN_NAME_TEST;
创建表HR.EMP_DEP_BEN_NAME_TEST
(员工身份变量2(11个字符),
名字变量2(30个字符),
最后名称VARCHAR2(30个字符),
MIDDLE_NAME VARCHAR2(30 CHAR));
---- 插入测试数据 ---
插入人力资源。emp_dep_ben_ben_name_test
值 (101,'Alondra','Dominguez','Kadyn');
插入人力资源。emp_dep_ben_ben_name_test
值 (101,“艾默生”,“麦克马洪”,“德里克”);
插入人力资源。emp_dep_ben_ben_name_test
值 (101,“天使”,“巴尔”,“情人节”);
插入人力资源。emp_dep_ben_ben_name_test
值 (103,'Ronnie','Rosario','Sterling');
插入人力资源。emp_dep_ben_ben_name_test
值 (103、 “锡安” 、 “巴克斯特” 、 “本杰明”);
插入人力资源。emp_dep_ben_ben_name_test
价值观 (104,“天使”,“亨德里克斯”,“凯莱”);
插入人力资源。emp_dep_ben_ben_name_test
价值观 (104,'Alexandria','Perkins','Alanna');
插入人力资源。emp_dep_ben_ben_name_test
值 (104,'Zain','Browning','Ava');
插入人力资源。emp_dep_ben_ben_name_test
值 (106,“康纳”,“沃尔夫”,“达拉斯”);
插入人力资源。emp_dep_ben_ben_name_test
值 (109、 “贾斯珀” 、 “韦尔奇” 、 “马龙”);
插入人力资源。emp_dep_ben_ben_name_test
值 (109,'Makayla','Maddox','Phoebe');
插入人力资源。emp_dep_ben_ben_name_test
值 (109,'Kaylen','Melendez','Elena');
-----
-- DROP TABLE HR.dummy_first_name;
-- DROP TABLE HR.dummy_last_name;
创建表HR.dummy_first_name nologging,从HR.Employes_test中选择distinct(first_name);
从HR.Employes_test创建表HR.dummy_last_name nologging作为选择distinct(last_name);
--- 用虚拟名称更新EMP_DEP_BEN_NAME_TEST表。这是60,000行超过7小时的步骤。
将服务器输出设置为
声明
cntr号;
光标c1是
从HR.EMP_DEP_BEN_NAME_TEST中选择rowid;
开始
cntr := 0;
对于c1中的rec
循环
更新HR.EMP_DEP_BEN_NAME_TEST set FIRST_NAME = (选择first_name从hr.dummy_first_name按DBMS_RANDOM.VALUE顺序选择first_name),其中rownum = 1),
LAST_NAME = (从中选择last_name (从hr.dummy_last_name按DBMS_RANDOM.VALUE顺序选择last_name),其中rownum = 1),
MIDDLE_NAME = (从中选择first_name (从hr.dummy_first_name按DBMS_RANDOM.VALUE顺序选择first_name),其中rownum = 1)
其中rowid = rec.rowid;
cntr := cntr 1;
结束循环;
dbms_output.put_line (cntr);
结束;
/
专家解答
您可以使用PL/SQL表保存源数据,然后插入新行而不是更新
所以 (在我的笔记本电脑上) 大约是每秒200,000行。
SQL> @drop EMPLOYEES_TEST Y1 Y2 ----------------------- ------------------------- TABLE cascade constraints purge 1 row selected. Table dropped. SQL> SQL> CREATE TABLE EMPLOYEES_TEST 2 ( EMPLOYEE_ID NUMBER(6,0), 3 FIRST_NAME VARCHAR2(20 BYTE), 4 LAST_NAME VARCHAR2(25 BYTE), 5 EMAIL VARCHAR2(25 BYTE), 6 NAME_DISPLAY VARCHAR2(50 BYTE), 7 NAME_FORMAL VARCHAR2(50 BYTE), 8 NAME VARCHAR2(50 BYTE), 9 CONTACT_NAME VARCHAR2(50 BYTE) 10 ); Table created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES (101,'Neena','Kochhar','NKOCHHAR','Neena Kochhar','Neena Kochhar','Kochhar,Neena','Mallin,Jason'); 1 row created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES(103,'Alexander','Hunold','AHUNOLD','Alexander Hunold','Alexander Hunold','Hunold,Alexander','Chung,Kelly'); 1 row created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES(104,'Bruce','Ernst','BERNST','Bruce Ernst','Bruce Ernst','Ernst,Bruce','Cambrault,Nanette'); 1 row created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES(106,'Valli','Pataballa','VPATABAL','Valli Pataballa','Valli Pataballa','Pataballa,Valli','Dilly,Jennifer'); 1 row created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES(107,'Diana','Lorentz','DLORENTZ','Diana Lorentz','Diana Lorentz','Lorentz,Diana','Sarchand,Nandita'); 1 row created. SQL> SQL> INSERT INTO EMPLOYEES_TEST 2 VALUES(109,'Daniel','Faviet','DFAVIET','Daniel Faviet','Daniel Faviet','Faviet,Daniel','Fripp,Adam'); 1 row created. SQL> SQL> SQL> @drop EMP_DEP_BEN_NAME_TEST Y1 Y2 ----------------------- ------------------------- TABLE cascade constraints purge 1 row selected. Table dropped. SQL> SQL> CREATE TABLE EMP_DEP_BEN_NAME_TEST 2 (EMPLOYEE_ID VARCHAR2(11 CHAR), 3 FIRST_NAME VARCHAR2(30 CHAR), 4 LAST_NAME VARCHAR2(30 CHAR), 5 MIDDLE_NAME VARCHAR2(30 CHAR) 6 ); Table created. SQL> SQL> set timing on SQL> set serveroutput on SQL> declare 2 3 type name_list is table of varchar2(30) index by pls_integer; 4 l_first name_list; 5 l_last name_list; 6 7 type l_target is table of EMP_DEP_BEN_NAME_TEST%rowtype index by pls_integer; 8 l_row l_target; 9 10 begin 11 12 select distinct first_name bulk collect into l_first from EMPLOYEES_TEST; 13 select distinct last_name bulk collect into l_last from EMPLOYEES_TEST; 14 15 for i in 101 .. 20000 16 loop 17 l_row(i).employee_id := i; 18 l_row(i).first_name := l_first(trunc(dbms_random.value(1,l_first.count))); 19 l_row(i).last_name := l_last(trunc(dbms_random.value(1,l_last.count))); 20 l_row(i).middle_name := l_first(trunc(dbms_random.value(1,l_first.count))); 21 end loop; 22 23 forall i in 101 .. 20000 24 insert into EMP_DEP_BEN_NAME_TEST values l_row(i); 25 26 dbms_output.put_line (sql%rowcount); 27 END; 28 / 19900 PL/SQL procedure successfully completed. Elapsed: 00:00:00.12 SQL>复制
所以 (在我的笔记本电脑上) 大约是每秒200,000行。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
705次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
635次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
547次阅读
2025-04-20 10:07:02
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
495次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
490次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
487次阅读
2025-04-22 00:13:51
一页概览:Oracle GoldenGate
甲骨文云技术
471次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
418次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
373次阅读
2025-04-15 14:48:05
OR+DBLINK的关联SQL优化思路
布衣
360次阅读
2025-05-05 19:28:36