DBデータベーススペシャリスト試験 午後Ⅰ
令和5年度秋期 データベーススペシャリスト 午後Ⅰ 問3
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題



![表3 観測データを分析するSQL文の例(未完成)。SQL1の目的と構文の表。目的は圃場ごと・農事日付ごとに1日の平均温度と行数を調べること。WITH R(圃場ID,農事日付,日平均温度,行数)AS(SELECT[a],COUNT(*) FROM 観測 GROUP BY[b])SELECT * FROM R。空欄はaとb。](/figures/ec987bc19a1ccf39d47ad3882a4c1ecb5e0f33cfd09ff168f41ef71998ea924c.webp)


![図3 SQL2の結果行(未完成)。農事日付とXの結果行の表。2023-02-01と02-02は網掛け。Xは02-03から順に11.0,12.0,[c],14.0,[d],13.0,[e],17.0。Xの表示桁数と網掛けに関する注記がある。](/figures/0cf746acf83027e6e19b881d0a4dffa97db808391def352b3f8d151b190c2f70.webp)
![表5 積算温度を調べるSQL文(未完成)。SQL3の目的と構文の表。圃場ごと・農事日付ごとの積算温度を SUM([f]) OVER(PARTITION BY[g] ORDER BY[h] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) で求め,農事日付の期間で絞り込む。ホスト変数と網掛け部分の注記あり。](/figures/8e7ad60318b403914192fbdc1128090b5b64daa60e64ea3e41192fe98d330b1b.webp)
![表6 区分化前と区分化後の読込みに必要な表領域のページ数の比較(未完成)。区分化前はページ当たり4行(4,000バイト)で144,000行を読み込み144,000ページ。区分化後はページ当たり16行(16,000バイト)で144,000行を読み込み,読込みページ数は空欄[ア]ページ。](/figures/4403c1f13cd0371eac8965c018b7b61084d3f6dd8f98d841a5e4cb0bc197941e.webp)
![表7 区分化前と区分化後の年末処理の主な手順の比較(未完成)。区分化前は期限が特になし。手順は1.“圃場カレンダ”に翌年の行を追加,2.[イ],3.“圃場カレンダ”を再編成,4.[ウ]。区分化後は期限が元日の日出時刻。手順は1.翌年の行を追加,2.“観測”に翌年度の区分を追加,3.[エ],4.[オ],5.[カ]。](/figures/6a9cb50521d0270fd584743e1831f47acfa21dee74fcc520ad99316b9301b852.webp)
解き方のヒントを見る
前提条件を根拠に設計判断を検証する
この種の問題では、一般的な知識だけで判断せず、問題に示されたデータの性質や業務上の要件を根拠として読み取ることが重要です。各判断がどの前提に基づいているかを確認し、前提と矛盾しないかを一つずつ照らし合わせて検討しましょう。
この問題で問われていること
確認すべき観点は一つです。問題の記述から、データがどのように発生し蓄積されるか、どのような目的で参照・保守されるかという前提を抜き出し、検討対象の判断がその前提に照らして妥当かを自分の言葉で説明できるかを確かめてください。
視点
データベースの問答や設計の検討では、同じ手法でも前提となるデータの特性や利用目的によって評価が変わります。そのため、一般論として良い・悪いと決めつけるのではなく、問題に書かれた条件を判断の根拠に置くことが大切です。記述のどの部分が根拠になるかを意識して読み、自分の判断がその根拠と結び付いているかを確かめる習慣をつけましょう。
確認ポイント
- 問題の記述の中で、データの発生・蓄積・参照・保守に関する条件がどこに書かれているかを確認したか
- 自分の判断が、一般論ではなく問題に示された条件のどれに基づいているかを説明できるか
- 判断の根拠とした条件を読み落としたり、書かれていない条件を補って考えたりしていないか
正解と解説を見る
解説
農業用ハウスの観測データ分析システムを題材に、SQLのウィンドウ関数を使った集計、農事日付という業務上の日付の扱い、大容量テーブルのレンジ区分化による性能改善と年末処理の効率化を問う問題です。本文にあるRDBMS仕様(行の挿入位置、再編成、区分の追加・切離し)と外部キー制約(ON DELETE CASCADE)を組み合わせて考えることが求められます。
問題の全体像
B社は、統合機器から毎分送られるレコードを“観測”テーブルに蓄積し、農家向けに分析する分析システムを構築します。行は観測日付・観測時分・圃場IDごとに1行で、将来は1、000圃場・最長5年分に達する大容量テーブルになります。農家は日出時刻を区切りとする農事日付を使うため、標準日付とは異なる1日の区切りを意識する必要があります。出題趣旨では、農作業の特徴を踏まえたテーブル構造を理解したうえで、SQLのウィンドウ関数を使った分析、表領域の区分化とその運用、性能見積りの能力を問うとしています。設問1はSQL(集約、移動平均、累積和)、設問2は区分化による読込みページ数の変化と年末処理の手順を扱います。
設問1(1)a
SQL1の目的は「圃場ごと農事日付ごとに1日の平均温度と行数を調べる」ことです。WITH句で定義するRの列は(圃場ID、 農事日付、 日平均温度、 行数)で、行数はCOUNT(*)が受け持ちます。そのため、空欄aにはCOUNT(*)より前の3列を並べます。日平均温度は、1分間の平均値である分平均温度を1日分平均したものなので、AVG(分平均温度)になります。公式解答例では「圃場ID、 農事日付、 AVG(分平均温度)」です。
設問1(1)b
集計の単位は「圃場ごと農事日付ごと」なので、GROUP BYには集約関数以外でSELECTする列、つまり圃場IDと農事日付を指定します。標準日付である観測日付でグループ化すると、農事日付の1日とは区切りがずれるため目的に合いません。公式解答例では「圃場ID、 農事日付」です。
設問1(2)
表1では、農事日付は「圃場の日出時刻から翌日の日出時刻の1分前まで」と定義されています。業務の概要1.(3)にあるとおり、日出時刻は日ごとに変わります。そのため、ある日の日出から翌日の日出までの分数は1、440分(24時間)より多い日も少ない日もあり、毎分1行登録される“観測”の行数も農事日付単位では1、440行になりません。公式解答例では「日出時刻が日々異なり1日の分数が同じとは限らないから」「農事日付の1日は1、440分とは限らないから」です。採点講評では、この設問の正答率はやや低く、農事日付の1日の区切りが日出時刻であるという説明から理由を理解してほしいと述べています。30字以内に収めるには「日出時刻が日ごとに変わる」「農事日付の1日の分数が一定でない」の2点を押さえます。
設問1(3)c
SQL2のXは、AVG(日平均温度) OVER (ORDER BY 農事日付 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)です。つまり、その日と前2日を合わせた3日間の移動平均です。検算として、02-03のXは(9.0+14.0+10.0)/3=11.0、02-04は(14.0+10.0+12.0)/3=12.0となり、図3の値と一致します。02-05のcは、02-03〜02-05の10.0、12.0、20.0の平均で42.0/3=14.0です。公式解答例も14.0です。
設問1(3)d
02-07のdは、02-05〜02-07の3日分(20.0、10.0、15.0)の平均で、45.0/3=15.0です。公式解答例も15.0です。前後の既知の値である02-06=14.0((12+20+10)/3)、02-08=13.0((10+15+14)/3)でも同じ計算方法が成り立つことを確認できます。
設問1(3)e
02-09のeは、02-07〜02-09の3日分(15.0、14.0、19.0)の平均で、48.0/3=16.0です。公式解答例も16.0です。02-10の17.0も(14.0+19.0+18.0)/3で一致します。
設問1(4)f
業務の概要2.(4)にあるとおり、積算温度は1日の平均温度をある期間にわたって合計したものです。RのうちSUMで累積する対象は日平均温度になります。ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWで、先頭行から現在行までの累積和を求めます。公式解答例では「日平均温度」です。
設問1(4)g
SQL3は、SQL2と違って圃場IDで絞り込まず、「圃場ごと農事日付ごと」の積算温度を求めます。複数の圃場の行が混ざるので、ウィンドウを圃場IDで区画に分けないと、別の圃場の日平均温度まで合計されてしまいます。したがってPARTITION BYには圃場IDを指定します。公式解答例では「圃場ID」です。採点講評では、gの正答率がやや低く、農事日付とする誤答が散見されたと述べています。分析対象が複数の圃場である場合に、ウィンドウを圃場IDで区画に分け、区画ごとに日平均温度を農事日付順に集計するという役割を理解することが求められています。
設問1(4)h
積算温度は日付の古い順に累積していくため、ORDER BYには農事日付を指定します。PARTITION BY 圃場IDで区画がすでに分かれているので、農事日付だけで順序は決まります。公式解答例では「農事日付」のほか「圃場ID、 農事日付」も挙げられています。
設問2(1)
RDBMS仕様2.(2)では、ハッシュ区分は区分数を変更する場合に全行を再分配するとされています。一方、物理設計の変更(3)では、新たな圃場を追加する都度、区分を1個追加する方針です。ハッシュ区分では、区分を追加するたびに大容量の全行を再分配することになります。また、ハッシュ値で分配すると、一つの区分に複数の圃場の行が混在する可能性があり、圃場単位・年度単位でまとめるという狙いにも合いません。公式解答例では「区分を追加する都度,全体の行の再分配が必要になるから」「同じ圃場に異なる圃場の観測データが混在する可能性があるから」「レンジ区分でも区分の行数をほぼ同じにする利点が得られるから」の3つが示されています。35字以内では、このうち一つの観点を簡潔に書きます。
設問2(2)ア
区分化後は、圃場IDごと・年度ごとの区分に行が格納されます。そのため、一つの区分(表領域)には同じ圃場の行だけが、挿入順(時刻順)に連続して並びます。ページ長を16、000バイトにすると1ページに16行が入るので、ある圃場の100日分144、000行は連続した144、000/16=9、000ページに収まります。公式解答例では9、000です。採点講評では、この設問の正答率が低く、圃場ごと年度ごとに区分化することで同じページ内に別の圃場の観測データが混ざらないことを読み取ってほしい、ページ長を大きくしたことに加えて区分化によって大きな改善効果を得ていることに着目してほしいと述べています。
設問2(3)
RDBMS仕様1.(1)にあるとおり、行は表領域の最後のページに順に格納されます。区分化前は、各圃場の統合機器が毎分レコードを送るため、同じ時分の行が圃場の数だけ続けて挿入されます。その結果、1ページ(4行)に入る行はすべて異なる圃場の行になり、特定の圃場の行を副次索引でたどると、1行ごとに別のページを読むことになります。これが表6の区分化前144、000ページの根拠です。公式解答例では「同じ圃場の行は,1ページに1行しか格納できないから」です。採点講評では、(2)アと同様に正答率が低かったとしています。30字以内で「同じ圃場の行が1ページに1行しかない」ことを示します。
設問2(4)
区分キーの年度は、農事日付の1月1日から12月31日の範囲です。12月31日24時(元日0時)から元日の日出時刻の1分前までの観測データは、農事日付では12月31日に属するため、前年度の区分に格納されます。翌年度の区分が必要になるのは、農事日付が1月1日になる元日の日出時刻からです。そのため、翌年度の区分の追加などの年末処理はそれまでに済ませればよいことになります。公式解答例では「元日の日出時刻までのデータは前日の農事日付に含まれるから」です。35字以内で「元日の日出前のデータは前日(前年度)の農事日付に属する」ことを書きます。
設問2(5)イ
区分化前の手順では、3.で“圃場カレンダ”を再編成しているため、その前に“圃場カレンダ”から古い行を削除しておく必要があります。表2の外部キー制約はON DELETE CASCADEなので、“圃場カレンダ”の古い行を削除すると、それを参照する“観測”の古い行も連鎖して削除されます。そのため、“観測”から個別に削除する③は不要です。公式解答例では①です。
設問2(5)ウ
RDBMS仕様1.(2)にあるとおり、行を削除してできた領域は(最後のページを除き)挿入に再利用されません。連鎖削除で“観測”に生じた空き領域を回収し、表領域を有効に利用するには、“観測”も再編成する必要があります。公式解答例では④です。
設問2(5)エ
区分化後は、5年以上前の年度の区分を切り離すことで、古い“観測”の行をまとめて除去できます。RDBMS仕様2.(3)にあるとおり、切離しでは区分内の行のログが記録されないため効率的です。この手順を“圃場カレンダ”の削除より前に行うことが重要です。先に“圃場カレンダ”を削除すると、ON DELETE CASCADEによって“観測”の大量の行が1行ずつ削除されてしまいます。公式解答例では⑤です。
設問2(5)オ
古い区分を切り離した後で、“圃場カレンダ”から古い行を削除します。この時点では参照している“観測”の行はすでに切り離されているので、連鎖削除の負荷は生じません。公式解答例では①です。
設問2(5)カ
“圃場カレンダ”で削除によって生じた空き領域は再利用されないため、最後に“圃場カレンダ”を再編成します。“観測”は区分を切り離しただけで、行を削除したわけではないため、再編成(④)は不要です。公式解答例では②です。
学習のポイント
ウィンドウ関数(PARTITION BY、ORDER BY、ROWSによる枠指定)の意味と計算方法、行の格納順序から読込みページ数を見積もる方法、レンジ区分の切離しと連鎖削除を組み合わせた運用手順を押さえましょう。
出典:独立行政法人 情報処理推進機構(IPA)令和5年度秋期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針