質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

2回答

6408閲覧

Oracleへのインサートが遅い(パラメータによって大幅に異なる)

jk233

総合スコア55

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2019/07/11 08:39

サーバ:Oracle11g
クライアント:Windows10+Vagrant+CentOS7.4.1708、oracle-instantclient11.1-sqlplus-11.1.0.7.0-1

SQL

1CREATE TABLE TABLE1 (COL1 VARCHAR2(1500));

SQL

1(test.sql2select to_char(systimestamp, 'yyyy/mm/dd hh24:mi:ss.ff3') from dual; 3insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 4insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 5insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 6insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 7insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 8insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 9insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 10insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 11insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 12insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 13insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 14insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 15insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 16insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 17insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 18insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 19insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 20insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 21insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 22insert into TABLE1 (COL1) values ('111・・・(中略)・・・111'); 23commit; 24select to_char(systimestamp, 'yyyy/mm/dd hh24:mi:ss.ff3') from dual;

インサートしようとする値が1146Byteの場合(1が1146回連続した文字列をインサートする場合)

bash

1[root@localhost home]# sqlplus xxx/xxx@192.168.0.xxx:1521/xxx @test.sql 2 3SQL*Plus: Release 11.1.0.7.0 - Production on Thu Jul 11 17:08:43 2019 4 5Copyright (c) 1982, 2008, Oracle. All rights reserved. 6 7 8Connected to: 9Oracle Database 11g Release 11.2.0.3.0 - 64bit Production 10 11 12TO_CHAR(SYSTIMESTAMP,'YYYY/MM 13----------------------------- 142019/07/11 17:08:33.018 15 16 171 row created. 18 19 201 row created. 21 22 231 row created. 24 25 261 row created. 27 28 291 row created. 30 31 321 row created. 33 34 351 row created. 36 37 381 row created. 39 40 411 row created. 42 43 441 row created. 45 46 471 row created. 48 49 501 row created. 51 52 531 row created. 54 55 561 row created. 57 58 591 row created. 60 61 621 row created. 63 64 651 row created. 66 67 681 row created. 69 70 711 row created. 72 73 741 row created. 75 76 77Commit complete. 78 79 80TO_CHAR(SYSTIMESTAMP,'YYYY/MM 81----------------------------- 822019/07/11 17:08:33.049

インサートしようとする値が1147Byteの場合(1が1147回連続した文字列をインサートする場合)

bash

1[root@localhost home]# sqlplus xxx/xxx@192.168.0.xxx:1521/xxx @test.sql 2SQL*Plus: Release 11.1.0.7.0 - Production on Thu Jul 11 17:06:42 2019 3 4Copyright (c) 1982, 2008, Oracle. All rights reserved. 5 6 7Connected to: 8Oracle Database 11g Release 11.2.0.3.0 - 64bit Production 9 10 11TO_CHAR(SYSTIMESTAMP,'YYYY/MM 12----------------------------- 132019/07/11 17:06:31.478 14 15 161 row created. 17 18 191 row created. 20 21 221 row created. 23 24 251 row created. 26 27 281 row created. 29 30 311 row created. 32 33 341 row created. 35 36 371 row created. 38 39 401 row created. 41 42 431 row created. 44 45 461 row created. 47 48 491 row created. 50 51 521 row created. 53 54 551 row created. 56 57 581 row created. 59 60 611 row created. 62 63 641 row created. 65 66 671 row created. 68 69 701 row created. 71 72 731 row created. 74 75 76Commit complete. 77 78 79TO_CHAR(SYSTIMESTAMP,'YYYY/MM 80----------------------------- 812019/07/11 17:06:35.659

つまり、
インサートしようとする値が1146Byteの場合は約0.03秒で完了します。
インサートしようとする値が1147Byteの場合は約4.18秒で完了します。
パラメータを1Byte増やすだけで処理時間が大幅に増えるのですが、どのようなことが理由として考えられるでしょうか。
宜しくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しました。

ミドルウェアをバージョンアップすると改善しました。
・問題が起きるバージョン →Vagrant2.0.2+VirtualBox5.2.6
・問題が起きないバージョン→Vagrant2.2.5+VirtualBox6.0.8

また、別マシンでも発生しておりましたが、同様に改善しました。
・問題が起きるバージョン →Vagrant2.2.5+VirtualBox5.2.0
・問題が起きないバージョン→Vagrant2.2.5+VirtualBox5.2.30
このマシンではVirtualBoxのバージョンアップのみで改善しました。

※ちなみにバージョンアップ以前にOS(Windows10)の再起動を試しましたが、問題は改善しませんでした。

投稿2019/07/12 07:55

jk233

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

前回の回答に書きました。提示したURLをちゃんと読んでSQLを実行した結果を質問に追記しては?

追記

クライアント:Windows10+Vagrant+CentOS7.4.1708、oracle-instantclient11.1-sqlplus-11.1.0.7.0-1

クライアントのメモリは? 16GB 以上積んでいますか? Windows10+Vagrant+CentOS7.4.1708 ってかなりメモリを食います。

INSERT文があるファイルをDBサーバーに置いて、DBサーバーのsqlplusでINSERTを実行した方が早いかも?

なお、INSERT文のファイルを修正できると少し早くなるかも?

SQL

1SET TIMING ON 2insert all 3 into TABLE1 (COL1) values ('111・・・(中略)・・・111') 4 ... 5 into TABLE1 (COL1) values ('111・・・(中略)・・・111') 6SELECT * FROM DUAL ; 7COMMIT ; 8SET TIMING OFF

投稿2019/07/11 08:52

編集2019/07/11 11:24
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問