きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

ショー・エロス

show errorsを打ち間違えて、show errosとなることがある。

くだらないけど、本当にしょっちゅう打ち間違えるんだから仕方ない。


2日前に作ったストアドプロシージャは、どうやら性能測定に採用されるっぽい。
初めての作品が、そんな大事なことに使われていいんでっしゃろか?


Javaオンリーで作ったものと比べて、かなり速いのだ。

手続き型言語を舐めるなよ、ってことさ。

自分がsqlplusから擬似データを投げた感じでは、
1万2000件レコードのselectと1万2000件レコードのINSERTを0.014秒くらいでやる。
この数字はプロシージャの先頭からRETURN前までだ。
PL/SQLが速いとしても、速すぎだろうと思う。

JavaCSVを読んで、プロシージャにString[]を渡すには
WASから強引にOracleのConnectionを取り出して、
ArrayDescripterやらArrayやらでsetArrayに持ち込むのだ。

この際、命名規則がどうのこうのと怒られるだろう。
スキーマ名と型名に関する規則だ。
詳しいことはOracleのマニュアルを読もうね。

nls_charsetも無いと動かないらしい。
へぇ〜、理屈が分からないよ。何に載っていたんだろう。。。
事象としては、PL/SQL側に配列が渡ってきて、
素数も確かに1あるんだけど、取り出そうとするとデータがありません、となる。

Java側はCSVの読み込みをやっているため時間のほとんどはそこに消費する模様。
JDBC経由で600KB相当のデータをどかんと渡すことになるので、
ネットワーク的に1〜2秒を費やしてしまうようだ。
本当はもっと速い子なのに、PL/SQLちゃんは。。。
逆算すると、CSVのI/Oは10秒程度かかるってことじゃないかな。
10KBのもので1秒程度ってことか。
1Byteの読み込みに0.1msってことだと、いくらなんでも遅すぎだから
この予測は誤っていると思う。


他の性能測定もJavaでは軒並み遅くなるだろうから、
土日月にちょっとでも仕上げておいて、切り札を用意しとかねばならん。

さて、180万件のselectと180万件のinsertをして、さらにカーソルを返すファンクション。
昨日、いいところまで作っていたんだけど、バグを発見してしまい、
直していたら途方もなくバグが波及してしまった。
普通のSQLエディターでPL/SQLを書くのには限界があるってことだ。


未初期化なVARCHAR2を使ってRPADなどをすると、戻りも未初期化な値になってしまうようだ。
そんなに気付きにくいのか。初期化漏れくらいエラーにしろって思った。
未初期化なものはLENGTHを計れない。
また、''で初期化したつもりでもLENGTHで0は返ってこない。
けっこう融通が利かないって思った。