SQL処理時間を求める問題について

東雲さん  
(No.1)
午後問題で出題されるSQL処理時間が難しくて理解できないです、、
難しいというかイメージができないです、、
同期データ入出力って何?処理のイメージが思い浮かばない。。などなど問題文中の説明だけじゃ
いまいちピンとこない状態です。

皆さんはどのように勉強なさっているのでしょうか?
何か詳しい解説が載っている書籍などありましたら教えていただきたく思います。
それとも、もう「こういう計算で解くものだ」と割り切って計算方法だけ覚えておくものでしょうか、、?
助言いただけますと幸いです。
2022.09.25 18:19
にゃんちゃんさん 
DB シルバーマイスター
(No.2)
午後問題は物理設計派ですかね、僕も性能評価とか処理時間とかをゴリゴリ計算していく物理設計派ですがかなりマイナーです。

僕の場合は、通称「三好本」で土台を築いて、過去問で引っかかるたびにググって覚えていきました。
去年も受験して、その時は「なんかよく知らんけど、こんな計算したら探索行数とか必要ページ数とか求まるんよな」という理解度で玉砕しました。

正直、事細かに理解はしてないですし、試験2週間前にしてまだまだ詰めている途中ではあります。
DBサーバー側とクライアント側のデータ送受信について、まとまった書籍があれば教えてほしいですね・・・。

とりあえず問題内容や解説を理解できるレベルにはなってきましたが
ここにその知識体系を文章でダラダラ書いても、過去問題と同じようなことを書くだけになりそうな・・・。
2022.09.25 22:52
にゃんちゃんさん 
DB シルバーマイスター
(No.3)
とりあえず要点だけ書いてみますと
SQLクライアントと呼ばれる側(データを利用するアプリケーションなど)と
DBサーバー側(SQLでの命令、クエリを受け取ってSELECTなりINSERTなりするもの)があります。

SQL処理時間:SQL文を発行して、処理が完了するまでにかかる時間
  SQL処理にかかる時間は、CPU時間と物理I/O時間に分かれます。

CPU時間:SQLを実行するために必要な計算をする時間
  何かいろいろデータを加工したり並べ替えたりしてるんですかね。
  ここは正直よく分かりませんw

物理I/O時間(ディスクI/O時間):データベースからデータを出し入れする時間
  ストレージ(ハードディスクなど)から必要なデータを取り出すのですが、ここはかなり時間がかかります。
  よって、インデックスを使ってみたりバッファを使ってみたりして、できるだけ少ない行数のやり取りで済むようにしています。

ここで、SQL処理時間=CPU処理時間+物理I/O時間?
と思いがちですが、そうとも限りません。
以下の2パターンに分かれます。

①非同期データ入出力
CPU処理と物理I/Oを同時進行して時間短縮しています。
よって、SQL処理時間はCPU処理時間と物理I/O時間のうち、より大きい方になります。
Excel関数っぽく書くとMAX(CPU時間,物理I/O時間)です。

②同期データ入出力
こちらは逆に同時進行しない方法です。
よってSQL処理時間≒CPU処理時間+物理I/O時間となります。
厳密には他にもいろいろやることはあるっぽいですが、ざっくりこれで近似しています。
2022.09.25 23:11
東雲さん  
(No.4)
にゃんちゃんさん
ありがとうございます。
私も「三好本」をベースに勉強しています。
今回は三好本で午後1対策として推奨されている
平成23年問3を解いた際にSQLの処理時間に疑問を持ちました。
因みに午後Ⅱは三好さんが推奨している論理設計でいこうと思ってますw

本件ですが、詳しくありがとうございます。
SQLクライアント、DBサーバという切り口で考えてこなかったので非常に参考になりました。
追加の疑問点があるのですが宜しいでしょうか?

・ここでのCPU時間というのは(SQLクライアントとDBサーバ側の合計)と考えて良いのでしょうか?

・物理I/O時間は、問題文にかかれている(入出力処理時間)と同じ認識です。
データバッファへアクセスする時間はSQL処理時間に入れなくてもよいのでしょうか?それともデータバッファはCPUに含まれている?
(データバッファ自体あまり分かってない質問ですみません。。)

長々と申し訳ありませんが、ご教示いただければと思います。
2022.09.26 15:47
にゃんちゃんさん 
DB シルバーマイスター
(No.5)
・CPU時間について
通常はDBサーバー側(以下DB側)のCPU時間を指すかと思いますが
問題文に明記されるor気にしなくていい、のどちらかになると思います。
※CPU時間は1行あたり〇秒、のような指定だけされるかと。

・データバッファの時間
こちらも問題で指定されると思います。
細かいことを含めると、クライアント側(アプリケーションの略で以下AP側)からDB側にSQL文を送る時間とか
こまごまありますが、基本的には「SQL処理時間=CPU時間+物理I/O時間」で計算するよう指定されることが多いかと思います。

SQL文で必要データを取得するざっくりの流れとしては
①AP側からDB側にSQL文を発行する
②DB側は受け取ったSQL文を認識して、ストレージ(データ保存場所。きほんハードディスク)から必要データページを取得
③DB側は取得したデータをページ単位でAP側に送信

②③で時間がかかる仕組みです。
よって、できるだけやり取りするレコード数(ページ数)を減らすためにいろいろな工夫をします。

・激重なテーブルの全レコードを取得
とても重たい処理なので、DBサーバーに負担がかかって他のクエリの処理も遅くなります。
激重テーブル同士の直積(100億レコード×1000万レコードなど)はもってのほかです。
実務でやると各方面から怒られます(経験済)。

・WHERE句で条件を絞ってレコードを取得
セオリーです。とにかく条件を絞って行数を減らします。
表探索ならいったん全レコードを探索して、必要なレコードだけ結果として返します。

・インデックスを作成、索引探索にする
索引を使用して、探索するレコード自体を絞ります。

・物理分割(パーテショニング)する
1つのテーブルを、例えば月ごとの区分に分割します(12か月分のデータテーブルなら12分割)。
WHERE 売上年月 = '202209'とすると、全レコードを探索ではなく
2022年9月の区分のページだけ探索します。

・データバッファに入れる
データバッファは身近な作業机のようなもので
ここにデータを置いておけば、必要な時にすぐ取得できます。
ストレージ(ディスク)にアクセスしないので物理I/O時間はなしです。
バッファをめちゃくちゃ大きくするのは費用がかかって現実的ではないですが
テーブルまるごとバッファにぶちこめば、バッファヒット率100%になり、物理I/O時間はゼロになります。

・・・と長々書きましたが
僕もそんなに実務経験は長くないので、もしかしたら認識が違うところもあるかもです。
その時はどなたかツッコミを入れてくださることでしょう。。。
そんなに大外れなことは無いかと信じてますが・・・
2022.09.26 21:43
東雲さん  
(No.6)
にゃんちゃんさん
ありがとうございます。
参考書にもなかなか書いていない情報で、とても参考になりました。
こちらの情報を繰り返し勉強して、試験に挑みたいと思います。
2022.09.27 22:02

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop