株式会社ナレッジベースの杉山です。
先日、Oracle 11gから19cへバージョンアップ後、サーバでのsqlplusの接続時間が遅くなったとのことで、調査したのですが、残念ながら解決には至ってません。
その際、接続が遅くなったことで、大幅にパフォーマンスが落ちたバッチ処理のソースを見せていただきました。
至る所でsqlplusでsqlスクリプトを実行しておりました。
sqlplusでデータベースの接続を毎回実行しているため、接続にかかる時間の影響をモロに受けています。
バッチファイルのイメージとしては下記のような状態です。
sqlplus user/password@servicename @c:\sql\setp1.sql
sqlplus user/password@servicename @c:\sql\setp2.sql
sqlplus user/password@servicename @c:\sql\setp3.sql
バッチファイルを下記のような記述にすることで、標準出力としてsqlplusに実行するsqlファイルのパスを渡すことができますので、Oracleデータベースとの接続回数を減らすことができます。
しかし、SQLの実行結果をもとに、次に実行するSQファイルを切り替えるのは難しいと思います。
(
echo @c:\sql\setp1.sql
echo @c:\sql\setp2.sql
echo @c:\sql\setp3.sql
) | sqlplus user/password@servicename
Windows Powewrshellの場合、下記のような書き方になると思います。
Write-Outputのエイリアスでechoコマンドも使えます。
&{
Write-Output "@c:\sql\setp1.sql"
Write-Output "@c:\sql\setp2.sql"
Write-Output "@c:\sql\setp3.sql"
} | sqlplus user/password@servicename
あかんやろなと思いつつ、下記ようなシェルを実行してみましたが、もちろん定期的に実行されることはありませんでした。
&{
$cmd = "select " + $i + ", to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') as now from dual;"
for ($i = 0; $i -lt 5; $++) {
Write-Output $cmd
Start-Sleep 1
}
} | sqlplus user/password@servicename