暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 创建测试日期-使用DBMS_RANDOM.VALUE和游标执行较差的更新。

askTom 2017-04-25
117

问题描述

我正在为开发人员构建沙箱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);
结束;
/

专家解答

您可以使用PL/SQL表保存源数据,然后插入新行而不是更新

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论