DBデータベーススペシャリスト試験 午後Ⅰ

平成25年度春期 データベーススペシャリスト 午後Ⅰ 問3

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問3 SQLの設計及び性能に関する次の記述を読んで、設問1~3に答えよ。 全国の法人及び個人に事務用品をインターネット販売しているE社は、RDBMSを用いた注文システムを運用している。注文システムの運用は、情報システム部のFさんが担当している。 〔RDBMSのアクセス経路に関する主な仕様〕 1. SQL文の実行ごとに、アクセス経路が決められる。 2. 各テーブルの定義情報、及び統計更新処理が収集する統計情報、例えば、各テーブルの行数及び列値の個数は、システムカタログに記録される。 3. 各テーブルの列値の個数は、統計更新処理時点の各列に存在する異なる値の個数である。 4. アクセス経路は、各テーブルの統計情報及び索引定義情報に基づき、RDBMSのオプティマイザによって表探索又は索引探索のいずれかに決められる。 5. 表探索は、索引を使わずに先頭のデータページから全行を探索する。索引探索は、WHERE句中の述語に適した索引によって行を絞り込んでから、データページ中の行を探索する。SQL文の実行によって取得される行を、結果行と呼ぶ。 6. 索引探索に使われる索引は、1テーブル当たり1個である。索引探索に使える列は索引キーを構成する先頭の列として定義され、かつ、述語の比較演算子は=、<、>、<=、>=のいずれかでなければならない。 7. オプティマイザは、アクセス経路を決めるとき、次のように仮定している。 (1) 統計情報は、テーブルの最新状態を反映したものである。 (2) 列値当たりの行数は均等である。 (3) 行数がゼロの場合、表探索が最適である。 〔販売商品の概要〕 販売する商品は、主にオフィス又は家庭で使用される事務用品である。販売する商品は、2階層のカテゴリによって分類される。カテゴリの例を次に示す。 (1) カテゴリ1は、筆記具、用紙などの大分類(100種類)を表す。 (2) カテゴリ1が筆記具の場合、カテゴリ2は鉛筆、ボールペンなどである。 〔テーブルの構造〕 注文処理に使用する主なテーブルの構造を図1に、主な列の意味を表1に示す。 図1 主なテーブルの構造 表1 主な列の意味 現在、「仮注文」テーブルのデータ保存期間を1か月間、また「注文」テーブル及び「注文明細」テーブルのデータ保存期間を3か月間として、毎月の末日に統計更新処理を行い、その後に不要な行を削除する削除処理を行っている。2013年3月末日に統計更新処理を行ったときにシステムカタログに記録された主なテーブル及び列の統計情報、並びに索引定義情報を、表2に示す。 表2 主なテーブル及び列の統計情報、並びに索引定義情報(一部未完成) 〔注文処理の概要〕 1. 注文システムによる処理 注文システムは、24時間オンライン稼働している。注文システムによる処理の概要は、次のとおりである。 なお、文中の(SQL1)、(SQL6)、(SQL7)は、表3のSQL1、SQL6、SQL7がそれぞれ実行されることを示す。 (1) 商品照会 ① 顧客は、インターネットから注文処理を呼び出し、メニューを表示させる。 ② 顧客は、メニューから商品照会を選んで、商品のカテゴリ1のカテゴリ名の一覧を表示させ、そのうちの一つを検索条件として選択する。 ③ 注文システムは、検索条件に合致する商品の情報(商品名、定価、販売価格、割引率、商品画像など)を「商品」テーブルから取得し(SQL1)、商品一覧画面に最大10商品を表示する。 ④ 顧客が次画面ボタンをクリックすると、次の10商品が表示される。 (2) 仮注文入力 ① 顧客は、商品一覧画面の1個又は複数個の商品に注文数を入力する。 ② 注文システムは、「在庫」テーブルを調べ、引当可能な商品ならば、「仮注文」テーブルに1行を追加する。注文システムは、1画面の処理ごとにCOMMIT文を発行する。 ③ 顧客は、仮注文入力を終えると、発送・支払に必要な顧客名、発送先住所などの情報を入力し、注文内容を注文確認画面で確認してから注文確定ボタンをクリックする。 ④ 仮注文入力が注文確定とならなかった場合、注文システムは注文処理を終了させて、「仮注文」テーブルから該当行を削除し、COMMIT文を発行する。 (3) 注文確定 ① 仮注文入力が注文確定となったとき、注文システムは、「注文」テーブルに1行を追加する。「仮注文」テーブルから主キー順に1行ずつ取得しながら(SQL6)、注文確定の列に'Y'を設定し、かつ、商品ごとに「在庫」テーブルの引当可能数の列を更新し(SQL7)、「注文明細」テーブルに1行を追加する。これを商品数だけ繰り返し、最後にCOMMIT文を発行する(在庫引当ができなかった場合の処理については、省略)。 ② その後、注文の支払が完了したとき、該当する「注文」テーブルの行の支払済の列に'Y'を設定する。 2. 注文処理に使用する主なSQL文 注文処理に使用する主なSQL文を、表3に示す。表3の平均結果行数は、表2の統計情報とオプティマイザの仮定に基づいて計算される推定行数である。また、表3のSQL1のホスト変数に「P1」を指定した場合のSQL1の結果行を、表4に示す。 表3 注文処理に使用する主なSQL文及び平均結果行数(一部未完成) 表4 SQL1の結果行(一部省略) 〔テーブルの保守の見直し〕 Fさんは、毎月の末日に行っていたテーブルの保守を、次のように日次処理として見直すことにした。 なお、行の削除にはDELETE文を用いる。 (1) 注文の少ない毎朝4時から4時30分までの間、仕掛り中の注文処理を終わらせ、仕掛り中の注文処理がないことを確認した後、注文処理を一時的に停止する。 (2) 「仮注文」テーブルの不要な行(注文確定の列が'Y'の行)を削除する。 (3) 「注文」テーブルの不要な行(保存期間を超過し、かつ、支払済の列が'Y'の行)、及び「注文明細」テーブルの不要な行を削除する。 (4) (2)、(3)の処理を行った後、テーブルを再編成し、次に統計更新処理を行う。 (5) 注文処理を再開する。 〔問題点の指摘〕 Fさんの上司であるG氏は、注文処理とテーブルの保守の見直しについて、次の問題点を指摘した。 ① 商品一覧画面の表示では、SQL1を実行したときの平均結果行数が多い。全結果行を取得してから表示するのではなく、1画面(10行)分を取得して、表示した方がよい。ただし、次の1画面分を取得するとき、最初から取得し直さないようにすべきである。 ② Fさんによる〔テーブルの保守の見直し〕では、アクセス経路が索引探索から表探索に変わるSQLがある。その結果、注文確定の際に、そのSQLを実行するたびに処理時間が長くなることが懸念される。 設問1 表2及び表3について、(1)~(3)に答えよ。 (1) 表2の「商品分類」テーブルの統計情報を基に、表2中の【a】、【b】に入れる適切な数値を答えよ。 (2) 表2の統計情報を基に、表3中の【c】~【e】に入れる適切な数値を答えよ。 (3) 表2の統計情報を基に、「注文明細」テーブルについて、一つの注文で発生した最大明細行数を答えよ。 設問2 〔問題点の指摘〕の①への対応について、(1)、(2)に答えよ。 (1) Fさんが表4の取得順で示した11行目以降を取得するために表3のSQL5を実行したところ、最初の3行の取得順は次のようになった。この取得順で示した2、3行目の【ア】、【イ】に入れる適切な字句を答えよ。 (2) (1)の結果はFさんの目的とは異なるので、SQL5を1画面目の情報を使って、次のように修正した。【ウ】~【オ】に入れる適切な字句を答えよ。なお、【ウ】~【オ】に入れる述語はそれぞれ一つとする。 SELECT * FROM 商品 WHERE C1番号='P1' AND ((【ウ】 AND 【エ】)OR(【オ】)) ORDER BY C1番号、C2番号、商品番号 設問3 〔問題点の指摘〕の②への対応について、(1)~(3)に答えよ。 (1) アクセス経路が索引探索から表探索に変わるSQLを、表3のSQL1~SQL7の中から一つ答え、アクセス経路が変わる理由を、40字以内で述べよ。 (2) (1)で答えたSQLのアクセス経路が表探索に変わった場合、そのSQLを実行するたびに処理時間が長くなる理由を、40字以内で述べよ。 (3) (1)で答えたSQLがアクセスするテーブルについて、②の問題点を改善するために表2に示した統計情報がシステムカタログに存在するという前提で、毎朝4時に行う次のA~Cの処理を正しい順番に並べよ。 なお、不要な処理は省いてよい。 A:不要な行の削除 B:再編成 C:統計更新処理
図1 主なテーブルの構造。注文処理に使用する顧客、カテゴリ、商品、在庫、仮注文、注文、注文明細などの主なテーブル構造を示す図。
図1 主なテーブルの構造。注文処理に使用する顧客、カテゴリ、商品、在庫、仮注文、注文、注文明細などの主なテーブル構造を示す図。
表1 主な列の意味。顧客番号、カテゴリ番号、商品番号、注文番号など、各テーブルの主要列の意味を説明する表。
表1 主な列の意味。顧客番号、カテゴリ番号、商品番号、注文番号など、各テーブルの主要列の意味を説明する表。
表2 主なテーブル及び列の統計情報、並びに索引定義情報(一部未完成)。各テーブルの行数、列値の個数、索引1~3の定義を一覧化した統計情報の表。
表2 主なテーブル及び列の統計情報、並びに索引定義情報(一部未完成)。各テーブルの行数、列値の個数、索引1~3の定義を一覧化した統計情報の表。
表3 注文処理に使用する主なSQL文及び平均結果行数(一部未完成)。注文処理で使用するSQL1~SQL7と、それぞれの平均結果行数を示す表。
表3 注文処理に使用する主なSQL文及び平均結果行数(一部未完成)。注文処理で使用するSQL1~SQL7と、それぞれの平均結果行数を示す表。
表4 SQL1の結果行(一部省略)。SQL1の検索結果について、取得順、C1番号、C2番号、商品番号などを示した表。
表4 SQL1の結果行(一部省略)。SQL1の検索結果について、取得順、C1番号、C2番号、商品番号などを示した表。
取得順。SQL5実行後の最初の3行について、取得順とC1番号、C2番号、商品番号などを示す表。
取得順。SQL5実行後の最初の3行について、取得順とC1番号、C2番号、商品番号などを示す表。
処理順。不要な行の削除、再編成、統計更新処理について、現在の処理順と改善後の処理順を示す表。
処理順。不要な行の削除、再編成、統計更新処理について、現在の処理順と改善後の処理順を示す表。
解き方のヒントを見る

統計情報と取得結果を整理する視点

統計や検索結果を考えるときは、まず設問が尋ねている対象を一つに定め、情報の性質と取得方法を混同せずに、観測した結果が何を表すのかを確認しましょう。そのうえで、条件や前提が変わった場合に解釈が変わらないかを見直します。

この問題で問われていること

今回の確認点は、提示された情報が「性能を見積もる材料」なのか「実際に返された結果」なのかを区別し、設問の要求と同じ対象を見ているかを丁寧に確かめることです。用語だけで判断せず、文脈上の役割に注目します。

視点

情報源・評価対象・取得結果という三つの観点を頭の中で分け、各記述がどの対象について述べているかを対応づけます。個々の用語を暗記した印象だけで結論を出さず、設問が求める確認対象との関係を順に整理することが大切です。

確認ポイント

  • 設問が確認を求めている対象を一つに絞る
  • 記述中の対象と観察対象が一致しているか確認する
  • 前提条件が変わると解釈も変わるか見直す
正解と解説を見る

解説

RDBMSの統計情報を基に、結果行数の推定、複合キーによるページング、統計情報と保守処理がアクセス経路へ与える影響を問う問題です。

問題の全体像

E社の注文システムでは、RDBMSが統計情報と索引定義を基にSQLのアクセス経路を決める。設問1では表の行数・列値の個数から結果行数を見積もり、設問2では複合キーの順序を保った次ページ取得を考える。設問3では、仮注文表の削除後に統計情報が実態と合わなくなり、SQL6が索引探索から表探索へ変わる問題と、保守処理の順序を問う。

設問1(1)(a)

商品分類表では、C1番号の異なる値が100個、C2番号の異なる値が500個あり、カテゴリ1とカテゴリ2を合わせた行数になる。したがって、行数aは100+500=600です。

設問1(1)(b)

親カテゴリ番号はカテゴリ2が所属するカテゴリ1の番号であり、カテゴリ1自身の行ではNULLになる。したがって、異なる親カテゴリ番号の個数はカテゴリ1の種類数と同じ100です。

設問1(2)(c)

注文表の行数2、700、000を、顧客番号の異なる値300、000個で均等に分ける。顧客番号を条件にしたSQL2の推定結果行数は2、700、000÷300、000=9です。

設問1(2)(d)

注文明細表の行数27、000、000を、注文番号の異なる値2、700、000個で均等に分ける。注文番号を条件にしたSQL3の結果行数は27、000、000÷2、700、000=10です。

設問1(2)(e)

SQL4は注文年月日で注文表を絞り、注文番号で注文明細表と結合する。注文表の90日分の各日には2、700、000÷90=30、000件の注文があり、1注文当たり10明細なので、結果行数は300、000です。

設問1(3)

注文明細表の行数27、000、000を注文数2、700、000で割ると、1注文当たりの平均明細行数は10になる。ただし表2の明細番号の列値の個数は48であり、1注文内で取り得る最大明細番号が48までであるため、最大明細行数は48行となる。

設問2(1)(ア)

1画面目の10行目はC2番号AA1、商品番号00051です。SQL5は商品番号だけを00051より大きい条件にするため、次のC2グループであるAA2の商品も対象になる。ORDER BYの順序に従うと、2行目の商品番号は00055です。

設問2(1)(イ)

SQL5の結果は、C2番号AA1で商品番号00051より大きい行に続き、C2番号AA2の商品番号00055以降が並ぶ。したがって3行目の商品番号は00072となる。

設問2(2)(ウ)

1画面目の最後の行と同じC2番号AA1に属する商品については、商品番号が00051より大きい行だけを取得する。したがって述語はC2番号='AA1'です。

設問2(2)(エ)

同じC2番号AA1の中で、1画面目の最後の商品番号00051より後の行を取得する条件なので、商品番号>'00051'となる。

設問2(2)(オ)

1画面目の最後のC2番号より後のカテゴリの商品は、商品番号に関係なく取得する必要がある。したがって条件はC2番号>'AA1'となる。これにより、同じカテゴリ内の続きと後続カテゴリを分けて取得できる。

設問3(1)

対象はSQL6です。仮注文表の全行を削除した直後に統計更新を行うと、統計情報上の行数がゼロになる。オプティマイザは行数ゼロの場合に表探索を最適と仮定するため、索引探索から表探索へ変わる。40字以内では、SQL6、仮注文表の統計情報の行数がゼロになることを押さえる。

設問3(2)

SQL6は注文確定時に仮注文表から行を1行ずつ取得する。表探索では実行のたびに表の先頭から行を読むため、仮注文表に行が蓄積するほど読み込む行数が増え、実行回数ごとの処理時間が長くなる。

設問3(3)

公式解答例では、C・A・B、またはA・Bが示されている。統計更新を行う場合は、削除前にCを実施して実データに基づく統計を作り、その後Aで不要行を削除し、Bで再編成する。削除後に統計更新を行うと、仮注文表の行数ゼロという統計になり、SQL6が表探索を選ぶ問題につながるためです。既存の表2相当の統計情報を利用できる場合は、Cを省いてA・Bとする。

学習のポイント

統計情報の計算、複合索引の先頭列、表の保守順序を重点的に学習する。

出典:独立行政法人 情報処理推進機構(IPA)平成25年度春期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針