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

Oracle 12c中CLOB列的批量插入比Oracle 11g慢

askTom 2017-08-27
725

问题描述

我们注意到,带有CLOB的大表插入物在12c上花费的时间比11g多。插入是在在线事务处理期间,我们将数据从一个业务部门复制到另一个业务部门。特别是有一张表需要更长的时间。为了调试这个,我在通用表上创建了一个简单的插入脚本

设置线形200
将服务器输出设置为
设置时间开启
设置时间开启
设置回声打开
从DUAL中选择systimetamp;

列产品格式a45
列版本格式a12
从PRODUCT_COMPONENT_VERSION中选择产品,版本,其中上层 (产品) 像 “oracle %”;


创建表TMP_TEST_LARGE_ROWS_CLOB
(Id号,CLOB_VALUE CLOB,RANDOM_STRING VARCHAR2(100));

开始
对于我在1 .. 1000循环
插入到TMP_TEST_LARGE_ROWS_CLOB中
(id,clob_value,random_string)
选择
i * rownum id,
DBMS_RANDOM.string ('B',500),
DBMS_RANDOM.string (“a”,20)
从双重
通过rownum连接 <= 1000;
提交;
结束循环;
结束;
/


以下是11g和12c的结果。

11g
21:49:41 SQL> 从DUAL中选择systimetamp;

系统戳
-
26-AUG-17 09.49.41.912231下午-07:00

逝去: 00:00:00。02
21:49:41 SQL>
21:49:41 SQL> 列产品格式a45
21:49:41 SQL> 列版本格式a12
21:49:41 SQL> 从PRODUCT_COMPONENT_VERSION中选择产品,版本,其中上层 (产品) 像 “oracle %”;

产品版本
-
Oracle数据库11g企业版11.2.0.3.0

经过: 00:00:00。10
21:49:42 SQL>
21:49:42 SQL>
21:49:42 SQL> 创建表TMP_TEST_LARGE_ROWS_CLOB
21:49:42 2 (Id号,CLOB_VALUE CLOB,RANDOM_STRING VARCHAR2(100));

创建的表。

逝去: 00:00:00.26
21:49:42 SQL>
21:49:42 SQL> 开始
21:49:42 2 对于我在1 .. 1000循环
21:49:42 3 插入到TMP_TEST_LARGE_ROWS_CLOB中
21:49:42 4 (id,clob_value,random_string)
21:49:42 5 选择
21:49:42 6 i * rownum id,
21:49:42 7 DBMS_RANDOM.string ('B',500),
21:49:42 8 DBMS_RANDOM.string (“a”,20)
21:49:42 9 从双重
21:49:42 10 通过rownum连接 <= 1000;
21:49:42 11 提交;
21:49:42 12 结束循环;
21:49:42 13 结束;
21:49:42 14/
PL/SQL过程成功完成。

逝去: 00:14:47.99
22:04:30 SQL>
22:04:30 SQL> 假脱机

12c

21:51:10 SQL> 从DUAL中选择systimetamp;

系统戳
-
26-AUG-17 09.51.10.638013下午-07:00

逝去: 00:00:00。00
21:51:10 SQL>
21:51:10 SQL> 列产品格式a45
21:51:10 SQL> 列版本格式a12
21:51:10 SQL> 从PRODUCT_COMPONENT_VERSION中选择产品,版本,其中上层 (产品) 像 “oracle %”;

产品版本
-
Oracle数据库12c企业版12.1.0.2.0

逝去: 00:00:00。01
21:51:10 SQL>
21:51:10 SQL>
21:51:10 SQL> 创建表TMP_TEST_LARGE_ROWS_CLOB
21:51:10 2 (Id号,CLOB_VALUE CLOB,RANDOM_STRING VARCHAR2(100));

创建的表。

逝去: 00:00:00。02
21:51:10 SQL>
21:51:10 SQL> 开始
21:51:10 2 对于我在1 .. 1000循环
21:51:10 3 插入到TMP_TEST_LARGE_ROWS_CLOB中
21:51:10 4 (id,clob_value,random_string)
21:51:10 5 选择
21:51:10 6 i * rownum id,
21:51:10 7 DBMS_RANDOM.string ('B',500),
21:51:10 8 DBMS_RANDOM.string (“a”,20)
21:51:10 9 从双重
21:51:10 10 通过rownum连接 <= 1000;
21:51:10 11 提交;
21:51:10 12 结束循环;
21:51:10 13 结束;
21:51:10 14/
PL/SQL过程成功完成。

经过: 00:46:05。83
22:37:16 SQL> 假脱机

同样,这只是一个例子,只是为了说明在一个循环中创建一百万行在12c中比11g慢得多。我们所面对的实际表格:
-有FK引用,因此不能使用附加提示。也有几个触发器
-从UI以多种方式更新表-插入1或2行或在业务部门复制期间,其中使用Insert... select... 子句批量插入记录。

附加信息:
我无法粘贴v $ 参数中的所有参数,因为它超过20000个字符。如果需要,我可以提供任何特定参数集的值。
我们想尽快迁移到12c,不想更改很多这样的插入,这些插入在各种PL/SQL包过程中。
任何关于为什么需要更多时间的帮助或建议将不胜感激。
在我得到上述结果的我们的测试实例中,12c实例具有更多的内存和sga大小
12C:
sga_max_size 85899345920
sga_target 85899345920

11g:
sga_max_size 10737418240
sga_target 10737418240







根据要求,以下是补充信息。

11g
SQL> 从PRODUCT_COMPONENT_VERSION中选择产品,版本,其中上层 (产品) 像 “oracle %”;

产品版本
-
Oracle数据库11g企业版11.2.0.3.0

SQL>
SQL> 从dual中选择dbms_metaada.get_ddl ('TABLE','tmp_test_large_row_clob ',user);

Dbms_metaada.get_ddl ('表','tmp_test_large_row_clob',用户)
-

创建表 “应用”。“TMP_TEST_LARGE_ROWS_CLOB”
(“身份证” 号码,
“CLOB _ 值” CLOB,
"RANDOM_STRING" VARCHAR2(100)
) 分段立即创建
PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
NOCOMPRESS NOLOGGING
存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “应用 _ dat”
LOB (“CLOB_VALUE”) 存储为基本文件 (
表空间 “应用 _ dat” ENABLE STORAGE IN ROW CHUNK 16384 RETENTION
NOCACHE NOLOGGING
存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认))

12c
SQL> 从PRODUCT_COMPONENT_VERSION中选择产品,版本,其中上层 (产品) 像 “oracle %”;

产品版本
-
Oracle数据库12c企业版12.1.0.2.0

SQL>
SQL> 从dual中选择dbms_metaada.get_ddl ('TABLE','tmp_test_large_row_clob ',user);

Dbms_metaada.get_ddl ('表','tmp_test_large_row_clob',用户)
-

创建表 “应用”。“TMP_TEST_LARGE_ROWS_CLOB”
(“身份证” 号码,
“CLOB _ 值” CLOB,
"RANDOM_STRING" VARCHAR2(100)
) 分段立即创建
PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
NOCOMPRESS NOLOGGING
存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “应用 _ dat”
LOB (“CLOB_VALUE”) 存储为安全文件 (
表空间 “应用 _ dat” ENABLE STORAGE IN ROW CHUNK 16384
NOCACHE NOLOGGING NOCOMPRESS KEEP_DUPLICATES
存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认))

专家解答

您能为我们在每种环境中做到这一点吗

设置长50000
从双选择dbms_metaada.get_ddl (“表”,“tmp_test_large_row_clob”,用户)

我们需要看看这些clob是如何创建/存储的

====

抱歉花了这么长时间才回复你。我使用basicfile和securefile进行了这些测试-两者之间没有太大区别。同样,我没有看到11和12.1之间的明显差异。但是12.2有明显的改善,所以这可能是我的建议。这些都是在同一台机器上完成的。


11.2.0.4
=
SQL> 创建表 “TMP_TEST_LARGE_ROWS_CLOB”
2 (“身份证” 号码,
3 “CLOB _ 值” CLOB,
4 "RANDOM_STRING" VARCHAR2(100)
5) 立即创建细分市场
6 PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
7 NOCOMPRESS NOLOGGING
8存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
9 pct增加0自由主义者1自由主义者组1
10 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
 11  LOB ("CLOB_VALUE") STORE AS BASICFILE (
12在行块16384中启用存储 RETENTION
 13  NOCACHE NOLOGGING
14存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
15 pc增加0 FREELISTS 1 FREELIST GROUPS 1
16 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认))
17/

创建的表。

SQL>
SQL> 设置时间开启
SQL> BEGIN
2为i IN 1 .. 100循环
3插入TMP_TEST_LARGE_ROWS_CLOB
4 (id,clob_value,random_string)
5选择
6 i * rownum id,
7 DBMS_RANDOM.string ('B',500),
8 DBMS_RANDOM.string (“a”,20)
9从双
10通过rownum连接 <= 1000;
11提交;
12端环;
13结束;
14/

PL/SQL过程成功完成。

Elapsed: 00:02:33.91
SQL> @ sessev

事件TOTAL_WAITS TOTAL_TIMEOUTS秒PCT
-
log file sync                                          3              0          0 00.00%
db file sequential read                                3              0          0 00.00%
events in waitclass Other                              9              0          0 00.00%
log file switch (checkpoint incomplete)                2              0        .01 00.01%
enq: RO - fast object reuse                            3              0        .01 00.01%
log file switch (private strand flush incomp           2              0        .01 00.01%
lete)

Disk file operations I/O                               3              0        .02 00.01%
CPU                                                                         153.74 99.97%

复制



12.1.0.2
=
SQL> 创建表 “TMP_TEST_LARGE_ROWS_CLOB”
2 (“身份证” 号码,
3 “CLOB _ 值” CLOB,
4 "RANDOM_STRING" VARCHAR2(100)
5) 立即创建细分市场
6 PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
7 NOCOMPRESS NOLOGGING
8存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
9 pct增加0自由主义者1自由主义者组1
10 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
11 LOB (“CLOB_VALUE”) 存储为安全文件 (
12在行块16384中启用存储
13 NOCACHE NOLOGGING NOCOMPRESS保持重复
14存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
15 pc增加0
16 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认))
17/

创建的表。

SQL>
SQL> 设置时间开启
SQL> BEGIN
2为i IN 1 .. 100循环
3插入TMP_TEST_LARGE_ROWS_CLOB
4 (id,clob_value,random_string)
5选择
6 i * rownum id,
7 DBMS_RANDOM.string ('B',500),
8 DBMS_RANDOM.string (“a”,20)
9从双
10通过rownum连接 <= 1000;
11提交;
12端环;
13结束;
14/

PL/SQL过程成功完成。

Elapsed: 00:02:46.10
SQL>
SQL> @ sessev  

事件TOTAL_WAITS TOTAL_TIMEOUTS秒PCT
-
local write wait                                       4              0          0 00.00%
db file single write                                   1              0          0 00.00%
log file sync                                          2              0          0 00.00%
锁存器: 缓存缓冲区链1 0 0 00.00%
control file parallel write                            3              0          0 00.00%
Data file init write                                   1              0          0 00.00%
events in waitclass Other                              2              0        .01 00.01%
log file switch completion                             1              0        .01 00.01%
control file sequential read                          71              0        .02 00.01%
db file sequential read                              270              0        .04 00.02%
Disk file operations I/O                              16              0        .07 00.04%
CPU                                                                          166.5 99.91%

复制


12.2.0.1
=
SQL> 创建表 “TMP_TEST_LARGE_ROWS_CLOB”
2 (“身份证” 号码,
3 “CLOB _ 值” CLOB,
4 "RANDOM_STRING" VARCHAR2(100)
5) 立即创建细分市场
6 PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
7 NOCOMPRESS NOLOGGING
8存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
9 pct增加0自由主义者1自由主义者组1
10 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
11 LOB (“CLOB_VALUE”) 存储为安全文件 (
12在行块16384中启用存储
13 NOCACHE NOLOGGING NOCOMPRESS保持重复
14存储 (初始1048576下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
15 pc增加0
16 BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认))
17/

创建的表。

SQL>
SQL> 设置时间开启
SQL> BEGIN
2为i IN 1 .. 100循环
3插入TMP_TEST_LARGE_ROWS_CLOB
4 (id,clob_value,random_string)
5选择
6 i * rownum id,
7 DBMS_RANDOM.string ('B',500),
8 DBMS_RANDOM.string (“a”,20)
9从双
10通过rownum连接 <= 1000;
11提交;
12端环;
13结束;
14/

PL/SQL过程成功完成。

逝去: 00:00:46.61

SQL> @ sessev

事件TOTAL_WAITS TOTAL_TIMEOUTS秒PCT
-
db文件并行读取1 0 0 00.00%
db文件单写6 0 0 00.00%
锁存器: 缓存缓冲区链1 0 0 00.00%
日志文件同步6 0 0 00.00%
enq: RO-fast对象重用3 0 0 00.00%
控制文件并行写入21 0 0 00.00%
db文件分散读取2 0 0 00.00%
日志文件开关 (私有链刷新incomp 1 0 .01 00.02%
lete)

本地写入等待8 0 .01 00.02%
控制文件顺序读取280 0 .06 00.12%
waitclass中的事件其他735 1 .16 00.33%
磁盘文件操作I/O 17 0 .22 00.45%
确认超过PGA限制28 28 .25 00.51%
db文件顺序读取7154 0 .54 01.11%
CPU 47.46 97.43%



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论