Oracle Database - Multi Row INSERT、バインド変数を使うとリテラル値を使う場合では見える景色が変わるんだよね #3 - ローカル表とリモート表での挙動の差異?! Tweet
Previously on Mac De Oracle
前回は、
Oracle Database - Multi Row INSERT、バインド変数を使うとリテラル値を使う場合では見える景色が変わるんだよね #2
このシリーズものの本題でした。(それ書くまでの寄り道が長かったわけですがw)
ということで今日は、その続編!!
前回で完結じゃないの?!
はいw 、というか再び、脱線していきます! www
前回使った無名PL/SQLブロックのスクリプト(バインド変数を使っている方だけですが)を使って、ローカル表とリモート表(via Database Link)へMulti row Insertするとどうなるのか?
(覚えていますか? 前々回、いろいろなバグやら未実装やらのエラーにハマりまくり、なんとかリモート表へMulti row Insert文を投げることに成功した話を。。。。)
ローカル表とリモート表だとどのような景色の違いがあるか、絶対、Network Round Trips(dblinkの)が増加するよね!!!
だとすると、差分(処理時間など含め)の多くは、そのDatabase Linkを介して発生するNetwork Round Trips部分だけのはず。。。ネットワークレイテンシーの影響が見えやすくなる? だろう。。。。。か。
(PL/SQLだからリモート表にするしかなかったのですが、本来なら、JavaやらPythonやらアプリケーションから実行するだけでその部分は見えるわけですけどもね。一応、PL/SQLでやってた流れで、やってみようかなと。。。。w 数々のバグやら仕様やらにハマりましたが。。。w)
ログが長いので、まとめから!w
ポイントになりそうなところだけv$mystatからまとめた表ですが、一目瞭然で、妙な箇所があります。
私が、事前に想定していたのは、execute countはローカル表と同じ値ですし、当然ですが、parse count (total) - parse count (hard) の数もローカル表と同じ想定でした。100rows付近がもっとも結果が良いのはどちらでも同じではあるのですが。。
また、それらに加えて、1,000rows/INSERTにしたケースでは、リモート表へのINSERTで、OPEN_CURSORS(デフォルト 300)が枯渇し、+1,000の 1,300に増加すると枯渇しかなった点です。1,000rowsの時に+1,000したOPEN_CURSORSで枯渇回避になるというのも、気になりますよね。。。。。
SQL*Net roundtrips to/from dblinkが乗ってくるのは、想定通りですが、なんとなく数も多めですしね。。。なんだろうこの違和感w。。。。
想定していた挙動と随分違いそう。。。。DB Linkをつかっちゃったからからもしれないですけども。。。。。。。。

以下、ローカル表とリモート表でバインド変数を利用したMulti row Insertを10行、100行、1,000行ごとで実行し、合計で 100,000行登録したログです。
なお、今回利用したスクリプトは前回のエントリの後半に載せたものと同じです。
また、DB Linkでリモート表としてアクセスできるようにした内容は前々回のエントリーを参照ください。
ローカル表で、Multi table Insert を 10行、100行、1000行単位で、100,000行登録(バイント変数利用)
SCOTT@localhost:1521/freepdb1> @multi_row_insert_bind_10 100000 10
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
46 CPU used by this session 9
46 CPU used when call started 8
46 SQL*Net roundtrips to/from client 9
...略...
46 execute count 1326
...略...
46 parse count (hard) 140
46 parse count (total) 319
46 parse time cpu 8
46 parse time elapsed 11
...略...
46 session pga memory 4385784
46 session pga memory max 6762144
46 session uga memory 2035760
46 session uga memory max 4893336
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:00.88
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
46 CPU used by this session 95
46 CPU used when call started 95
46 SQL*Net roundtrips to/from client 16
...略...
46 execute count 11479
...略...
46 parse count (hard) 149
46 parse count (total) 353
46 parse time cpu 8
46 parse time elapsed 12
...略...
46 session pga memory 3533816
46 session pga memory max 6762144
46 session uga memory 2101240
46 session uga memory max 4893336
...略...
46 user commits 10000
...略...
COUNT(1)
----------
100000
SEGMENT_NAME MB
------------------------------ ----------
MROWS_INS_TAB 45
表が切り捨てられました。
SCOTT@localhost:1521/freepdb1> @multi_row_insert_bind_100 100000 100
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
46 CPU used by this session 4
46 CPU used when call started 3
46 SQL*Net roundtrips to/from client 6
...略...
46 execute count 815
...略...
46 parse count (hard) 100
46 parse count (total) 226
46 parse time cpu 3
46 parse time elapsed 4
...略...
46 session pga memory 4123640
46 session pga memory max 6762144
46 session uga memory 1904800
46 session uga memory max 4893304
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:00.66
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
46 CPU used by this session 70
46 CPU used when call started 70
46 SQL*Net roundtrips to/from client 10
...略...
46 execute count 2119
...略...
46 parse count (hard) 123
46 parse count (total) 286
46 parse time cpu 6
46 parse time elapsed 7
...略...
46 session pga memory 3402744
46 session pga memory max 12119032
46 session uga memory 2101240
46 session uga memory max 4893304
...略...
46 user commits 1000
...略...
COUNT(1)
----------
100000
...略...
SCOTT@localhost:1521/freepdb1> @multi_row_insert_bind_1000 100000 1000
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
46 CPU used by this session 3
46 CPU used when call started 2
46 SQL*Net roundtrips to/from client 6
...略...
46 execute count 464
...略...
46 parse count (hard) 46
46 parse count (total) 193
46 parse time cpu 3
46 parse time elapsed 1
...略...
46 session pga memory 3878560
46 session pga memory max 3878560
46 session uga memory 1527152
46 session uga memory max 2279696
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:01.28
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
46 CPU used by this session 129
46 CPU used when call started 129
46 SQL*Net roundtrips to/from client 10
...略...
46 execute count 872
...略...
46 parse count (hard) 69
46 parse count (total) 254
46 parse time cpu 46
46 parse time elapsed 43
...略...
46 session pga memory 4337312
46 session pga memory max 49229472
46 session uga memory 2997304
46 session uga memory max 3259328
...略...
46 user commits 100
COUNT(1)
----------
100000
...略...
リモート表(via DB Link)で、Multi table Insert を 10行、100行、1000行単位で、100,000行登録(バイント変数利用)
リモート表は、Oracle Database - Multi Row INSERT、バインド変数を使うと、リテラル値を使う場合では見える景色が変わるんだよね #1 - バグなのか現時点の仕様なのか?で作成した環境をそのまま利用しています。
SCOTT2@localhost:1521/freepdb1> @multi_row_insert_bind_10 100000 10
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
179 CPU used by this session 4
179 CPU used when call started 3
179 SQL*Net roundtrips to/from client 9
...略...
179 execute count 603
...略...
179 parse count (hard) 55
179 parse count (total) 221
179 parse time cpu 2
179 parse time elapsed 4
...略...
179 session pga memory 3927032
179 session pga memory max 3927032
179 session uga memory 1637320
179 session uga memory max 2345032
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:22.88
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
179 CPU used by this session 896
179 CPU used when call started 896
179 SQL*Net roundtrips to/from client 16
179 SQL*Net roundtrips to/from dblink 240031
...略...
179 execute count 110719
...略...
179 parse count (hard) 91
179 parse count (total) 100268
179 parse time cpu 7
179 parse time elapsed 21
...略...
179 session pga memory 4320248
179 session pga memory max 4582392
179 session uga memory 2277856
179 session uga memory max 2858632
...略...
179 user commits 10000
...略...
COUNT(1)
----------
100000
...略...
SCOTT2@localhost:1521/freepdb1> @multi_row_insert_bind_100 100000 100
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
179 CPU used by this session 5
179 CPU used when call started 5
179 SQL*Net roundtrips to/from client 6
...略...
179 execute count 831
...略...
179 parse count (hard) 107
179 parse count (total) 229
179 parse time cpu 4
179 parse time elapsed 4
...略...
179 session pga memory 4123640
179 session pga memory max 5648032
179 session uga memory 1904800
179 session uga memory max 3779144
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:18.01
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
179 CPU used by this session 817
179 CPU used when call started 817
179 SQL*Net roundtrips to/from client 10
179 SQL*Net roundtrips to/from dblink 204211
...略...
179 execute count 102095
...略...
179 parse count (hard) 234
179 parse count (total) 101389
179 parse time cpu 26
179 parse time elapsed 47
...略...
179 session pga memory 4582392
179 session pga memory max 6548472
179 session uga memory 3142472
179 session uga memory max 3779144
...略...
179 user commits 1000
...略...
COUNT(1)
----------
100000
...略...
リモート表へ、1000rows/INSERTを実行したら。。。。
SCOTT2@localhost:1521/freepdb1> @multi_row_insert_bind_1000 100000 1000
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
...略...
179 CPU used by this session 5
179 CPU used when call started 4
179 SQL*Net roundtrips to/from client 6
...略...
179 execute count 558
...略...
179 parse count (hard) 73
179 parse count (total) 212
179 parse time cpu 5
179 parse time elapsed 5
...略...
DECLARE
*
行1でエラーが発生しました。:
ORA-01000: セッションの最大オープン・カーソル数がPotential Leaked SQL_ID: を超えました ORA-02063:
先行のエラー・メッセージを参照してくださいline(FREEPDB1)。 ORA-02063:
先行のエラー・メッセージを参照してください2 lines(LINK2SCOTT)。 ORA-06512: 行59
ヘルプ: https://docs.oracle.com/error-help/db/ora-01000/
*
行1でエラーが発生しました。:
RA-01000: セッションの最大オープン・カーソル数がを超えました ヘルプ:
https://docs.oracle.com/error-help/db/ora-01000/
ん? 妙ですねぇー。OPEN_CURSORS=300(デフォルト)を超えちゃったようです。。。仕方ないので、一時的に大きめに。
なんかきになるなー。ローカル表だとそんなこと起きないのに。。。ちょうど+1,000したら回避できたというのも、なんとなく気になる値ではあるし。。。。
SYSTEM@localhost:1521/freepdb1> alter system set open_cursors = 1300 scope=memory;
システムが変更されました。
SCOTT2@localhost:1521/freepdb1> @multi_row_insert_bind_1000 100000 1000
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
16 CPU used by this session 5
16 CPU used when call started 5
16 SQL*Net roundtrips to/from client 6
...略...
16 execute count 805
...略...
16 parse count (hard) 107
16 parse count (total) 229
16 parse time cpu 4
16 parse time elapsed 4
...略...
16 session pga memory 4058104
16 session pga memory max 5123744
16 session uga memory 1899488
16 session uga memory max 3053984
...略...
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:24.14
SID NAME VALUE
---------- ---------------------------------------------------------------- ----------
16 CPU used by this session 1213
16 CPU used when call started 1213
16 SQL*Net roundtrips to/from client 10
16 SQL*Net roundtrips to/from dblink 202411
...略...
16 execute count 100996
...略...
16 parse count (hard) 1121
16 parse count (total) 101346
16 parse time cpu 85
16 parse time elapsed 135
...略...
16 session pga memory 12119032
16 session pga memory max 25619448
16 session uga memory 10382272
16 session uga memory max 12082240
...略...
16 user commits 100
...略...
COUNT(1)
----------
100000
...略...
ということで、新たな謎を追って、Matrix...いや、Oracleの奥地へ....wwww
To be continued....
関連エントリ
・帰ってきた! 標準はあるにはあるが癖の多いSQL #20 - Table Value Constructer (TVC)
・帰ってきた! 標準はあるにはあるが癖の多いSQL #21 - Table Value Constructer(TVC)- ハードパース時間とメモリ消費量 / BONUS TRACK
・帰ってきた! 標準はあるにはあるが癖の多いSQL #22 - Multi Row INSERT
・Oracle Database - Multi Row INSERT、バインド変数を使うと、リテラル値を使う場合では見える景色が変わるんだよね #1 - バグなのか現時点の仕様なのか?
・Oracle Database - Multi Row INSERT、バインド変数を使うとリテラル値を使う場合では見える景色が変わるんだよね #2
| 固定リンク | 0


コメント