($title_img_alt)

こちらからの投稿は、先頭に表示されているコメントへの返信になります。
ASのCPU使用率が100%近くになった場合 AS400 初心者 さん [ 10月5日(木) 16時18分 ]
いつもお世話になっております。
WRKSYSSTSでASのCPU使用率が表示されますが、このCPU使用率が上がり過ぎて
ASがダウンするなど何らかのトラブルが発生しますでしょうか?

レコード数が227万件、合計メンバーサイズが2016563200のPFがあり
このファイルをSQLから条件を選択して抽出するプログラムを作成しているの
ですが
SQLを実行するとCPU使用率が80%近くまで上昇します。

もし複数のPCからこのSQLを実行した場合はCPU使用率がもっと上がると思われ
ますので
このままプログラムを作成していいものかと躊躇しています。
RE:ASのCPU使用率が100%近くになった場合 IKD さん [ 10月5日(木) 20時38分 ]
227万件のレコードをSQLで読むというのはかなり乱暴に思えます。
SQLでのレコード抽出はすべてのレコードを読んでから
抽出するので当然パフォーマンスは良くありません。
それとSQLは索引部分をすべてCPUメモリの中に取込んで
しまうので大量のメモリを消費します。
その SQL も 227万件のレコードを全部読んでから
レコードを抽出しているのです。

ただしメモリ消費量が 100% 近くなったとしても
IBM i 自体には何の問題もありませんが
当然、他の業務はかなり遅くなってしまい
エンド・ユーザーからはクレームの嵐になります。

Windows PCに比べて IBM i のCPU容量は小さいとは思いませんか?
これは IBM i がレコード単位のアクセスが基本であるので
1レコードを読取るメモリがあれば十分であるのに対して
Windows のアーキテクチャーはプログラムがファイルを
読むのはファイル全体を読んですべてメモリに入れてから
処理するからです。
つまり Windows適用プログラムはファイル全体を読み込んで
しまわないと処理できないのです。
Windwosはストリーム・ファイルしか扱えないので
こんなことになってしまっています。
これが Windows がビジネス・ユースに向いていない原因です。

つまり 100MB の容量のファイルを読むには CPUが 100MB を
必要となってしまいます。
これに対して IBM i は 1レコード分しか読まないので
例えば 1レコードはせいぜい 1024バイトくらいしか必要ないのです。

ところが SQL となると IBM i でも話は別で
Windows と同じことが起こります。
つまりすべてのレコードを読んでメモリに入れる必要があるので
メモリを大量消費してしまいます。

ところが227万件あるデータ・ベースでもキーつきのファイルであれば
RPG で CHAIN すれば 0.01秒もかかりません。

もちろんメモリの消費も起こりません。
これは対象データ・ベースが 1000万件であっても同じです。
レコードは一瞬で抜き出されます。

長々と書いてしまいましたが SQL は大量データ・ベースのアクセスには
全く向いていませんし大量データ・ベースに SQL でフクセスするのは
不適切です。

たまに CHAIN を知らない開発者が無理やりなんでもSQLで
アクセスしているのを見かけますが IBM i にはせっかく
レコード・レベルのアクセスとして CHAIN があるのですから
是非利用してください。
大量データ・ベースに対しては苦手であってもSQLはやめましょう。

ご参考までに COBOL には CHAINはありません。
RE:ASのCPU使用率が100%近くになった場合 AS400 初心者 さん [ 10月6日(金) 10時9分 ]
色々ご教示頂きありがとうございます。


実はVBでASのデータを抽出してFormに表示する必要がありまして
下記のような流れでのプログラムを作成しております。

?対象データをユーザーの任意の検索条件で抽出
?抽出結果をリスト表示
?リストから選ばれたレコードを詳細データを別Formで表示


手順?で抽出する際にリスト表示する項目が多いとCPU負荷が高かったため
リスト表示する項目を大幅に減らしたところ、CPU使用率は20%程度までに抑え
られました
(それでも大きいとは思いますが)

ただこのプログラムを複数のユーザーに提供すると同時に実行される可能性が
あるため
最悪の場合CPU使用率100%いってしまうのではと思っておりました。

IKDさんのコメントでCPU使用率が100%にいってもASが落ちることはないという
ことでしたので少し安心しました。
ですがそもそもそのような大きなテーブルをSQLで抽出するということがあま
り良くないということですね。

負荷がかかり過ぎて他のASのプログラムに影響が長時間あると良くないため
検索範囲指定が広い場合はエラーにしたり、
2分待ってもSQL実行結果が返ってこなければエラーにして処理を中断するなどの
処理を加えたいと思います。

ありがとうございました。

お名前

パスワード

メールアドレス

タイトル

ホームページ

アドレス

項目