通勤列車で勉強する,2001年版
テクニカルエンジニア(データベース) 第4号

  

末広ページへ このコーナの目次
第1号(実質的な目次)

ver 1.00 2001/04/01


ジャン:ゆうちゃん,こんにちは。

ゆう:こんにちは。先生,いい天気やね。

ジャン:さっき,長良公園に行って来たら,桜,少し咲いていましたね。

ゆう:もう春ですね。試験も近いし。

ジャン:勉強しましょうか。

ゆう:はい。

ジャン:では,ゆうちゃん,線を引いてもらえますか?


問題: データベーススペシャリスト平成10年午後1問2

問2 問合せの最適化に関する次の記述を読んで,設問1〜3に答えよ。

 書店のK社では,関係データベースを使用して売上管理を行っている。本部スタッフは SQL文を用いて各種分析資料の出力及び照会を行う。

 K社の売上管理システムのテーブル構造は図1のとおりである。

 K社では,新たに月次の売上管理資料として,図2のような書籍分類による資料を作成するために,図3のような SQL文で問合せを行うことにし,業務運用上問題がないかどうかのテストを行った。

SELCET 書籍.書籍コード, 書名, 著者名, 出版社, SUM(冊数)
  FROM 売上明細, 書籍
    WHERE 売上明細.書籍コード = 書籍.書籍コード
      AND 書籍.分類 = 'ミステリ'
      AND 売上明細.販売年月日 = '199803'
    GROUP BY 書籍.書籍コード, 書名, 著者名, 出版社
図3 問合せ SQL 文

 なお,K社が使用している DBMS は次に示すような仕様となっている。

〔インデックス使用に関する規則〕

 次の規則に従い,インデックス使用に関するアクセスパスの最適化が行われる。

(1)WHERE 句での指定によるインデックス使用の優先順位

 優先順位1:"インデックスの設定された列名=定数" のユニークインデックス

 優先順位2:"インデックスの設定された列名=定数" の非ユニークインデックス

 優先順位3:"テーブル結合処理" で使用される列のインデックス

(2)(1)での優先順位が同じインデックスが複数存在する場合

 1.異なるテーブルに属しているインデックスがある頃合は,FROMに近い方に書いたテーブルのインデックスを優先する。

 2.すべてのインデックスが同じテーブルに属している場合は,WHEREに近い方に書いたインデックスを優先する。

〔テーブル結合処理〕

 テーブル結合処理は次に示すような入れ子ループ法を使用して行われる(図4参照)。

(1)I/Oバッファのブロック数は外側用,内側用それぞれ指定するものとする。

(2)FROM に近い方に書いたテーブルを外側ループ用とする。

(3)外側用,内側用それぞれのバッファに読み込めるだけブロックを読み込む。

(4)I/Oバッファ内の各ブロックに含まれるすべてのデータに対してマッチングを行う。

(5)外側用バッファ内容を固定し,内側用バッファに次のデータを読み込み,(4)のようにマッチングを行い,以下,順次内側用テーブルを全件マッチングする。

(6)外側用テーブルの次のデータを外側用バッファに読み込み,再度内側用テーブルを順次全件マッチングする。以下,外側用テーブルのデータ全件分繰り返す。

設問1

 図3の問合せを実行したとき,優先順位が一番に使用されるインデックスはどれか。

設問2

 図3の問合せでは選択が先に行われ,その結果を基にテーブル間の結合が行われるものとする。同題文中に示すような仕様に基づき,テーブル結合処理が行われるとした場合,次の条件でテーブル結合処理にかかる物理入出力時間(選択,及びグループ化に要する時間は含めない)は何秒か求めよ。答えは小数第1位を四捨五入して整数で求めよ。

・データ量は平均値を使う
 なお,書籍テーブルで分類が "ミステリ" のデータは 900 件である。

・I/Oバッファは外側用 1 プロツク内側用 50 ブロックを指定する。

1ブロックに格納される件数は売上明細が 40 件書籍が 20 件である。

1ブロック物理入出力時間は 25ミリ 秒である。

設問3

 次に,図3の SQL 文の "書籍.分類='ミステリ' ""書籍.分類='エッセイ' "(書籍テーブルで該当のデータは1,100件)に変更して問合せを行ったところ,処理が長時間となり,このままでは実務上使用に耐えられないことが判明した。

 原因調査の結果,物理入出力回数が非常に増加していることが分かった。

(1)物理入出力回数が非常に増加した理由を,80 字以内で述べよ。

(2)上記を改善するために,SQL文の変更以外での改善策を,50 字以内で述べよ。ただし,システムリソースの制約からI/Oバッファの総量は変更できないものとする。


ジャン:設問1から,順に解いていきましょう。

ゆう:はい。

設問1

 図3の問合せを実行したとき,優先順位が一番に使用されるインデックスはどれか。

ジャン:図3の問い合わせと,優先順位の説明を確認しましょう。

ゆう:まず,図3です。

SELCET 書籍.書籍コード, 書名, 著者名, 出版社, SUM(冊数)
  FROM 売上明細, 書籍
    WHERE 売上明細.書籍コード = 書籍.書籍コード
      AND 書籍.分類 = 'ミステリ'
      AND 売上明細.販売年月日 = '199803'
   GROUP BY 書籍.書籍コード, 書名, 著者名, 出版社

インデックスの優先順位は

〔インデックス使用に関する規則〕

 次の規則に従い,インデックス使用に関するアクセスパスの最適化が行われる。

(1)WHERE 句での指定によるインデックス使用の優先順位

 優先順位1:"インデックスの設定された列名=定数" のユニークインデックス

 優先順位2:"インデックスの設定された列名=定数" の非ユニークインデックス

 優先順位3:"テーブル結合処理" で使用される列のインデックスゆう

(2)(1)での優先順位が同じインデックスが複数存在する場合

 1.異なるテーブルに属しているインデックスがある頃合は,FROMに近い方に書いたテーブルのインデックスを優先する。

 2.すべてのインデックスが同じテーブルに属している場合は,WHEREに近い方に書いたインデックスを優先する。

ジャン:アクセスパスとは,利用するために通り道ということですが,ファイルのデータがどういう順に読まれるかということですね。

ゆう:優先順位1は,インデックスにしてあるので,定数との比較ですね。売上明細(表),書籍(表)のインデックスにしてあるのは,それぞれ,売上番号,書籍コードですが,それと定数との比較はありません。

ジャン:優先順位2の「非ユニークインデックス」というのは,読み込むためだけのインデックスで,主キーでないということですね。だから,重複をゆるすということで,非ユニークインデックスといっているのでしょう。

ゆう:優先順位2の非ユニークインデックスですが,売上明細(表)の方は,販売年月日で,書籍(表)の方は,分類です。

ジャン:図3のSQLでは,両方とも登場してますね。

      AND 書籍.分類 = 'ミステリ'
      AND 売上明細.販売年月日 = '199803'

ゆう:こういうときは,

(2)(1)での優先順位が同じインデックスが複数存在する場合

 1.異なるテーブルに属しているインデックスがある頃合は,FROMに近い方に書いたテーブルのインデックスを優先する。

とありますので,「売上明細.販売年月日 = '199803'」が優先ですね。

ジャン:そうですね。では,模範解答例としますね。

模範解答例
データベーススペシャリスト平成10年午後1問2設問1
売上明細.販売年月日

ゆう:アクセスパスとか,非ユニークインデックスとか,意味を知っていれば,簡単な設問でした。

ジャン:そうですね。では,設問2にいきましょう。


ゆう:はい。

設問2

 図3の問合せでは選択が先に行われ,その結果を基にテーブル間の結合が行われるものとする。同題文中に示すような仕様に基づき,テーブル結合処理が行われるとした場合,次の条件でテーブル結合処理にかかる物理入出力時間(選択,及びグループ化に要する時間は含めない)は何秒か求めよ。答えは小数第1位を四捨五入して整数で求めよ

・データ量は平均値を使う
 なお,書籍テーブルで分類が "ミステリ" のデータは 900 件である。

・I/Oバッファは外側用 1 プロツク内側用 50 ブロックを指定する。

1ブロックに格納される件数は売上明細が 40 件書籍が 20 件である。

1ブロック物理入出力時間は 25ミリ 秒である。

ジャン:テーブル結合処理は,

〔テーブル結合処理〕

 テーブル結合処理は次に示すような入れ子ループ法を使用して行われる(図4参照)。

(1)I/Oバッファのブロック数は外側用,内側用それぞれ指定するものとする。

(2)FROM に近い方に書いたテーブルを外側ループ用とする。

(3)外側用,内側用それぞれのバッファに読み込めるだけブロックを読み込む。

(4)I/Oバッファ内の各ブロックに含まれるすべてのデータに対してマッチングを行う。

(5)外側用バッファ内容を固定し,内側用バッファに次のデータを読み込み,(4)のようにマッチングを行い,以下,順次内側用テーブルを全件マッチングする。

(6)外側用テーブルの次のデータを外側用バッファに読み込み,再度内側用テーブルを順次全件マッチングする。以下,外側用テーブルのデータ全件分繰り返す。

ゆう:なんか面倒ですけど,問題文に従ってやれば解けそうですね。がんばって,やってみるね。

ジャン:では,やってみましょう。ここでいうブロックというのは,ディスクの入出力単位ですね。ブロックの大きさで主記憶に持ってくるということです。そのときに入る主記憶の場所が,バッファです。バッファに可能な限り,ブロックを一度に読み込むと問題文にあります。

(3)外側用,内側用それぞれのバッファに読み込めるだけブロックを読み込む。

ゆう:先生,

次の条件でテーブル結合処理にかかる物理入出力時間(選択,及びグループ化に要する時間は含めない)は何秒か求めよ。

 とあります。ということは,このブロックの入出力時間だけを計算すればいいのですね。

ジャン:そうです。

ゆう:外側のループのテーブルは,売上明細(表),内側のループのテーブルは,書籍(表)ですね。ここから,分かります。

(2)FROM に近い方に書いたテーブルを外側ループ用とする。

ジャン:そうですね。ゆうちゃん,簡単に動作を説明してもらえますか。

ゆう:まず,売上明細(表)の1998年の3月分を外側ループに入れて,内側ループで,書籍(表)の分類がミステリの分だけ入れて,結合します。内側ループですべて終わったら,外側ループを入れ替えて,また,内側ループで繰り返します。

ジャン:外側ループで,2回入れて,内側ループで3回入れたら,全部で何回入れたことになりますか?

ゆう:外側ループは,2回,それに加えて,内側ループは,それぞれに3回ですので,3回×2=6回ですね。

ジャン:そうですね。では,外側ループの入力回数から考えましょうか?

ゆう:まず,1998年3月分の売上明細は?

ジャン:設問には,書籍テーブルでミステリの分の件数が載ってますが,売上明細の方はないですね。

ゆう:先生,本文の方に,図1のところにデータ量が2,400,000件/年とあります。

ジャン:設問2のところに,平均量をつかうとありますので,単純に12ヶ月でわりましょう。そうすると,

 2,400,00 ÷ 12 = 200,000 (件)

ゆう:外側ブロックは,バッファは1ブロックで,ブロックに入る売上明細は40件とありますので,外側ループは,

 200,000 ÷ 40 = 5000 (回)

ジャン:そうですね。外側ループは,5000回ですね。外側ループの時間も計算しておきましょう。

ゆう:設問に,次のようにあります。

1ブロック物理入出力時間は 25ミリ 秒である。

 25 × 5000 = 125,000 (ミリ秒) = 125 (秒)

 先生,000が3つあって,ミリが簡単にとれました。

ジャン:先ほどの外側ループの回数,このミリ秒の秒への変換も簡単にいきましたよね。試験問題は,たいていこうのようにできています。実際の仕事だと,こうはいきませんね。

技:正しい解き方をすると,計算は,きれいになる。

ゆう:そうですね。先生,次,内側ループにいきますね。まず,データ量は,900件とあります。

ジャン:主記憶に用意したバッファは,50ブロック分,その50ブロックそれぞれにたいして,20件の書籍テーブルのデータが入りますね。

ゆう:先生,なんか混乱します。

ジャン:ブロックの計算は,まず,全件が何ブロックか明確にしていくといいですよ。

技:ブロック計算は,ブロック数を明確にする。

ゆう:900 ÷ 20 = 45 (ブロック)です。

ジャン:バッファにそれだけ一度で入るよね。

ゆう:そうですね。内部ループは,45ブロックを1度読み込んだら終わりですね。

ジャン:その時間は?

ゆう:25 × 45 = 1125 (ミリ秒)

ジャン:先ほど,ゆうちゃんが,言った,外側の1回ループあたり,内側のループを繰り返すというのは,今回は,全部バッファに入ってしまったので,1度のみで終わりですね。比較,選択等は主記憶ないで処理が終わりますので,ディスク入出力は,発生しません。

ゆう:ということは,単純に,先ほどの,125 秒に 1125 ミリ秒を足せば終わりですね。

ジャン:そうです。

ゆう:秒にして,小数点以下は,四捨五入ですので,答えは,126秒ですね。

ジャン:外側ループのために磁気ディスクが要する時間が,このうち,125秒,内側ループのためには,1秒でした。

ゆう:効率よかったですね。

ジャン:そうですね。では,模範解答例です。

模範解答例
データベーススペシャリスト平成10年午後1問2設問2
126 秒

ゆう:設問3にいきますね。

設問3

 次に,図3の SQL 文の "書籍.分類='ミステリ' ""書籍.分類='エッセイ' "(書籍テーブルで該当のデータは1,100件)に変更して問合せを行ったところ,処理が長時間となり,このままでは実務上使用に耐えられないことが判明した。

 原因調査の結果,物理入出力回数が非常に増加していることが分かった。

(1)物理入出力回数が非常に増加した理由を,80 字以内で述べよ。

(2)上記を改善するために,SQL文の変更以外での改善策を,50 字以内で述べよ。ただし,システムリソースの制約からI/Oバッファの総量は変更できないものとする。

ジャン:書籍分類を,エッセイにしたところ,時間がかかりすぎるそうですよ。

ゆう:内部ループに入れるデータが,バッファを超えて,ディスク入出力が数回になったのでしょうね。

ジャン:ゆうちゃん,それが,(1)の答えですよ。

ゆう:先生,でも80字とありますので,具体的に計算しなくてはいけないですか?

ジャン:時間次第ですね。時間がないときは,具体的な計算は,いいでしょう。

ゆう:先生,午後は,いつも時間が足らなくなりますので,具体的な計算は,しなくていいということですね。

ジャン:まあ,そうですね。

技:午後問題では,必要以上の計算はしない。

ゆう:では,80字足らなくてもいいですか?

ジャン:だいたい,7割から8割は埋めた方がいいですよ。

ゆう:私の解答を作りますね。

データベーススペシャリスト平成10年午後1問2設問3(1)
−−−−−−−−−−−−−−−−−−−−
内側ループの対象となる書籍テーブルのデー
タがバッファに一度に収まらなくなり,外側
ループの回数分,内部ループのためのディス
ク入出回数が必要となっため。(74)

ジャン:それでいいですよね。では,(2)の解決法は?

(2)上記を改善するために,SQL文の変更以外での改善策を,50 字以内で述べよ。ただし,システムリソースの制約からI/Oバッファの総量は変更できないものとする。

ゆう:これは,外側のバッファを減らし,内側のバッファを増やせばいいですよね。ミステリの900件から,エッセイで,1100件に増えただけですので,それほど,外側バッファを減らす必要もないし。なんといっても,内側ループのバッファに1度に納めることです。

ジャン:そうですね。ゆうちゃん,すぐに答えに気づいたけど,一応,技をあげておきますね。

技:「ただし」は,重大ヒント

ゆう:そうですね。ただしに,「総量は変更できない」って,わざわざ,総量以外をさわりなさいって言ってますね。

ジャン:では,ゆうちゃん,具体的にどうしたらいい?

ゆう:内側用のバッファを増やして,外側用のバッファを減らせば? 先生,だめだ。外側用のバッファって,もう,最低の1ブロック分ではないですか。

ジャン:そうだよね。

ゆう:では,逆は,どうですか?

ジャン:内側ループ用のバッファを1ブロック分にして,外側分を50ブロックにするということ?

ゆう:そうです。

ジャン:これは,計算する必要がありますね。

ゆう:外側は,全部で?

ジャン:先ほど計算しましたが,まず,ブロック数ですよ。

ゆう:5000ブロックです。

ジャン:バッファに50ブロック分割り当てると,

ゆう:5000 ÷50 = 100 回です。

ジャン:この100回というのは,50ブロック転送する回数が100回ということですね。外側ループのために磁気ディスク入出力時間は,50ブロック分が100回ですので,

 25 × 50 × 100 = 125000(ミリ秒)=125(秒)

ゆう:先生,この 125 ミリ秒って,設問2の外側ループに要する時間と同じですよ。

ジャン:設問2では,1ブロックを5000回やって,今は,50 ブロックを100回です。結局,どちらにしても,5000ブロック読み込んでいますからね。同じ答えです。

ゆう:そうか。

ジャン:内側ループは,

ゆう:まず,ブロックに注目ですね。計算しなてくはいけませんね。

 1100 ÷ 20 = 55 (ブロック)

ジャン:内側ループ用に,1ブロック分のバッファを用意するということは,外側ループ1回あたり,55回のブロック読み込みをするということです。外側ループのための中身が入れ替わるのは,100回です。

ゆう:25 × 55 × 100 = 137500 (ミリ秒) = 137.5秒 

ジャン:外側ループのためにディスク入出力時間が,125秒でしたので,併せて,125 + 138 = 263 秒ですね。

?