1

我需要在我的数据库中插入大量(50GB 的随机数据),以便我可以使用备份应用程序检查重复数据删除率。我写了一个小程序,如下所示

这需要1个多小时。我不知道如何提高性能,以便为插入语句获得良好的吞吐量。我已将 SGA 设置为 16GB。

我是甲骨文的新手。我不知道如何设置并行度来优化我的程序以获得良好的吞吐量。请帮忙。

alter session force parallel query parallel 4;
create table table_1(
col1 varchar2(400),
-- 50 columns like this
col50 varchar2(400));

create table table_2(
col1 varchar2(400),
-- 50 columns like this
col50 varchar2(400));

create table table_3(
col1 varchar2(400),
-- 50 columns like this
col50 varchar2(400));

create table table_4(
col1 varchar2(400),
-- 50 columns like this
col50 varchar2(400));

我的插入脚本:

Declare
    rows_inserted number := 0;
Begin
  Loop
        Begin
            INSERT INTO table_1(COL1, ..COL50)
            VALUES(dbms_random.string('L', 400),..for all 50 values);
        INSERT INTO table_2(COL1, ..COL50)
            VALUES(dbms_random.string('L', 400),..for all 50 values);
            INSERT INTO table_3(COL1, ..COL50)
            VALUES(dbms_random.string('L', 400),..for all 50 values);
            INSERT INTO table_4(COL1, ..COL50)
            VALUES(dbms_random.string('L', 400),..for all 50 values);
            --Only increment counter when no duplicate exception
            rows_inserted := rows_inserted + 1;
        --Exception When DUP_VAL_ON_INDEX Then Null;
        End;
        exit when rows_inserted = 10000;
    End loop;
    commit;
End;
/

我已经在安装在 rhel 7 VM 上的 Oracle12c 上尝试过这个过程。Vm 有 32 GB 内存和 20 GB 交换内存和 16 个 vcpus。

它需要1个多小时并且仍在运行。如何实现并行性并优化上述过程以获得良好的吞吐率?

4

1 回答 1

2

您正在循环内进行单行插入:这是一种非常缓慢的处理方式。SQL 是一种基于集合的语言,集合操作是执行批量操作的最佳执行方式。此外,您还依赖随机数据来提供重复项。控制它并保证比率。此外,当您的表没有唯一键时,如何获得 DUP_VAL_ON_INDEX ?(如果他们这样做了,您将无法插入实验所需的重复项。)

更好的方法是使用批量 sql:

INSERT INTO table_1(COL1, COL50)
select dbms_random.string('L', 400), dbms_random.string('L', 400)
from dual
connect by level <= 10000
/

INSERT INTO table_1(COL1, COL50)
select *
from table_1
where rownum <= 1000 
/

这将为您提供 11000 行table_1,其中 1000 行是重复的。重复第二次插入以增加重复项的数量。

应该不需要并行性。

我现在想要的是良好的吞吐量,它可以在 30 分钟内插入 50 GB 的数据,无论是否具有并行性。

然而,这条新信息改变了我的评估。并行运行的最简单方法是为每个表构建单独的例程并在单独的会话中运行每个例程。

于 2019-06-15T09:24:56.117 回答