データベーススペシャリスト試験 2023年 午後103


農業用機器メーカーによる観測データ分析システムの SQL 設計, 性能, 運用に関する次の記述を読んで, 設問に答えよ。

 ハウス栽培農家向けの農業用機器を製造・販売する B 社は, 農家の DX を支援する目的で, RDBMS を用いたハウス栽培のための観測データ分析システム (以下,分析システムという)を構築することになり, 運用部門のCさんが実装を担当した。  
〔業務の概要〕 1.顧客, 圃場, 農事日付  (1) 顧客は,ハウス栽培を行う農家であり, 顧客 ID で識別する。  (2) 圃場は,農家が農作物を育てる場所の単位で, 圃場 ID で識別する。 圃場には一つの農業用ハウス (以下, ハウスという) が設置され, トマト, イチゴなどの農作物が1種類栽培される。  (3) 圃場の日出時刻と日没時刻は, 圃場の経度, 緯度, 標高によって日ごとに変わるが,あらかじめ計算で求めることができる。  (4) 日出時刻から翌日の日出時刻の1分前までとする日付を, 農事日付という。農家は, 農事日付に基づいて作業を行うことがある。
2.制御機器・センサー機器, 統合機器, 観測データ, 積算温度  (1) 圃場のハウスには,ハウスの天窓の開閉, カーテン, 暖房, 潅水などを制御する制御機器, 及び温度 (気温), 湿度, 水温, 地温, 日照時間, 炭酸ガス濃度などを計測するセンサー機器が設置される。  (2) 顧客は, 圃場の一角に設置した B 社の統合環境制御機器 (以下, 統合機器という)を用いて,ハウス内の各機器を監視し, 操作する。 もし統合機器が何か異常を検知すれば, 顧客のスマートフォンにその異常を直ちに通知する。  (3) 統合機器は,各機器の設定値と各センサー機器が毎分計測した値を併せて記録した1件のレコードを, B 社の分析システムに送り、蓄積する。 分析システムは,蓄積されたレコードを観測データとして分析しやすい形式に変換し, 計測された日付ごと時分ごと圃場ごとに1行を “観測” テーブルに登録する。  (4) 農家が重視する積算温度は、 1日の平均温度をある期間にわたって合計したもので、生育の進展を示す指標として利用される。 例えば, トマトが開花してから完熟するまでに必要な積算温度は, 1,000〜1,100℃といわれている。  (5) 分析システムの目標は,対象にする圃場を現状の 100 圃場から段階的に増やし, 将来 1,000圃場で最長5年間の観測データを分析できることである。  
〔分析システムの主なテーブル〕   Cさんが設計した主なテーブル構造を図1に, 主な列の意味・ 制約を表1に示す。  また, “観測” テーブルの主な列統計, 索引定義, 制約, 表領域の設定を表2に示す。
データベーススペシャリスト試験(令和5年 午後I 問3 図1)
データベーススペシャリスト試験(令和5年 午後I 問3 表1)
データベーススペシャリスト試験(令和5年 午後I 問3 表2)
〔RDBMS の主な仕様〕 1.行の挿入 削除, 再編成  (1) 行を挿入するとき, 表領域の最後のページに行を格納する。 最後のページに空き領域がなければ, 新しいページを表領域の最後に追加し, 行を格納する。  (2) 最後のページを除き, 行を削除してできた領域は,行の挿入に使われない。  (3) 再編成では, 削除されていない全行をファイルにアンロードした後, 初期化した表領域にその全行を再ロードし, 併せて索引を再作成する。
2.区分化  (1) テーブルごとに一つ又は複数の列を区分キーとし, 区分キーの値に基づいて表領域を物理的に分割することを, 区分化という。  (2) 区分方法には次の2種類がある。   ・レンジ区分 区分キーの値の範囲によって行を区分に分配する。   ・ハッシュ区分: 区分キーの値に基づき, RDBMS が生成するハッシュ値によって行を一定数の区分に分配する。 区分数を変更する場合, 全行を再分配する。  (3) レンジ区分では, 区分キーの値の範囲が既存の区分と重複しなければ区分を追加でき, 任意の区分を切り離すこともできる。 区分の追加, 切離しのとき,区分内の行のログがログファイルに記録されることはない。  (4) 区分ごとに物理的に分割される索引 (以下, 分割索引という)を定義できる。区分を追加したとき、 当該区分に分割索引が追加され, また, 区分を切り離したとき,当該区分の分割索引も切り離される。  
〔観測データの分析〕
1.観測データの分析  分析システムは, 農家の要望に応じて様々な観点から観測データを分析し, その結果を農家のスマートフォンに表示する予定である。 Cさんが設計した観測データを分析する SQL 文の例を表3のSQL1 に, 結果行の一部を後述する図2に示す。
データベーススペシャリスト試験(令和5年 午後I 問3 表3)
2.SQL文の改良  顧客に表3の SQL1 の日平均温度を折れ線グラフにして見せたところ、知りたいのは日々の温度の細かい変動ではなく, 変動の傾向であると言われた。 そこでCさんは,折れ線グラフを滑らかにするため, 表4のSQL2のように改良した。 SQL2 が利用した表3の SQL1 の結果行の一部を図2に, SQL2の結果行を図3に示す。
データベーススペシャリスト試験(令和5年 午後I 問3 表4)
データベーススペシャリスト試験(令和5年 午後I 問3 図2)
3.積算温度を調べる SQL 文   農家は,栽培している農作物の出荷時期を予測するために積算温度を利用する。  Cさんが設計した積算温度を調べる SQL 文を,表5のSQL3 に示す。
データベーススペシャリスト試験(令和5年 午後I 問3 表5)
〔“観測” テーブルの区分化〕 1.物理設計の変更  Cさんは,大容量になる “観測” テーブルの性能と運用に懸念をもったので、次のようにテーブルの物理設計を変更し、性能見積りと年末処理の見直しを行った。
 (1) 表領域のページ長を大きくすることで1ページに格納できる行数を増やす。  (2) 圃場 IDごとに農事日付の1月1日から12月31日の値の範囲を年度として,その年度を区分キーとするレンジ区分によって区分化する。  (3) 新たな圃場を追加する都度、 当該圃場に対してそのときの年度の区分を1個追加する。
2.性能見積り  表5のSQL3について 表2に示した副次索引から100日間の観測データ 144,000行を読み込むことを仮定した場合の読込みに必要な表領域のページ数を,区分化前と区分化後のそれぞれに分けて見積もり, 表6に整理して比較した。
データベーススペシャリスト試験(令和5年 午後I 問3 表6)
3.年末処理の見直し  5年以上前の不要な行を効率よく削除し, 表領域を有効に利用するための年末処理の主な手順を, 区分化前と区分化後のそれぞれについて検討し, 表7に整理した。
データベーススペシャリスト試験(令和5年 午後I 問3 表7)

設問1(1)〔観測データの分析〕について答えよ。

表3中の(a), (b)に入れる適切な字句を答えよ。
模範解答
a:圃場ID, 農事日付, AVG(分平均温度) b:圃場ID, 農事日付
解説

キーワード・論点整理

  • 集約関数と GROUP BY
    SQL1 では「日平均温度」と「行数」を求めるために、AVG(分平均温度)COUNT(*) を使い、グルーピングのキーとして 圃場ID農事日付 を指定している。
  • WITH句の列エイリアス
    WITH R (圃場ID, 農事日付, 日平均温度, 行数) AS (
      SELECT <a>, COUNT(*) FROM 観測 GROUP BY <b>
    )
    
    <a> に SELECT 句の出力カラム、<b> に GROUP BY のキーを対応させる。

解答のポイント

(a) に入るべき字句

SELECT 句で取り出す出力列は、WITH句の列リスト
(圃場ID, 農事日付, 日平均温度, 行数)
に合わせて、次のように記述します。
  • 圃場ID
  • 農事日付
  • 日平均温度を求める集約関数:AVG(分平均温度)
したがって
<a>:圃場ID, 農事日付, AVG(分平均温度)

(b) に入るべき字句

GROUP BY は、SELECT 句で集約関数を 使わない 列(ここでは 圃場ID, 農事日付)を指定します。
<b>:圃場ID, 農事日付
これを当てはめると、SQL1 は次のように完成します。
SQL1(完成形)
WITH R (圃場ID, 農事日付, 日平均温度, 行数) AS (
 SELECT 圃場ID, 農事日付, AVG(分平均温度), COUNT(*)
 FROM 観測
 GROUP BY 圃場ID, 農事日付
)
SELECT * FROM R

なぜこの解答になるか

  1. 問題文で「圃場ごと農事日付ごとに1日の平均温度と行数を調べる」とある。
  2. 「1日の平均温度」は各分平均温度の平均なので、AVG(分平均温度) を使う(問題文〔2〕(3),(4)参照)。
  3. 「行数」は単に**COUNT(*)** で得る。
  4. 集約関数を用いる場合、GROUP BY に集約対象外の列(圃場ID, 農事日付)を指定しなければならない(SQLの基本ルール)。

誤りやすいポイント

  • GROUP BY に誤って 日平均温度COUNT(*) を入れる
    → 集約関数の結果は GROUP BY できない。
  • AVG(分平均温度) を忘れて 日平均温度 とだけ書く
    → 「1日の平均温度」を求めるためには必ず AVG が必要。
  • WITH句の列リストと SELECT 列の順序をそろえない
    → 順序が合わないとエラーや異なる結果を招く。

試験対策ポイント

  • 「GROUP BY」に列を指定するルール
    → SELECT 句で集約関数を使わない列を列挙する。
  • 集約関数の使い分け
    → 合計:SUM、平均:AVG、件数:COUNT、最大値・最小値:MAX/MIN
  • WITH句(Common Table Expression)では、列リストと SELECT 列の順序・数を一致させること
これらを確実に押さえておけば、類似の集約SQL問題を正しく解答できます。

設問1(2)〔観測データの分析〕について答えよ。

SQL1 の結果について、 1日の行数は, 1,440 行とは限らない。 その理由を30字以内で答えよ。 ただし, 何らかの不具合によって分析システムにレコードが送られない事象は考慮しなくてよい。
模範解答
・日時刻が日々異なり1日の分数が同じとは限らないから ・農事日付の1日は1,440分とは限らないから
解説

キーワード・論点整理

  • 「農事日付」
    表1より、
    「農事日付」は「日出時刻から翌日の日出時刻の1分前までとする日付」
  • SQL1 の COUNT(*) は、
    観測テーブルの各「農事日付」期間中のレコード件数を表す
  • 日出時刻は日々・圃場ごとに異なるため、期間の分数(=行数)は変動する

解答の理由

SQL1 では「農事日付」ごとに COUNT(*) しているため、
その値は「農事日付」の範囲内にある1分ごとの観測データ件数です。
しかし「農事日付」は
「日出時刻から翌日の日出時刻の1分前までとする日付」(表1)
と定義され、日出時刻は経度・緯度・標高などで日々変化します。
したがって「農事日付」の期間の分数は必ずしも1,440分(24時間)ではなく、
COUNT(*) が1,440行とは限りません。

受験者が陥りやすいポイント

  • 「1日=24時間=1,440分」と固定で考え、標準日付の分数と混同しやすい
  • 問われているのは「農事日付」ベースの集計である点を見落としがち

試験対策

  • 農事日付の定義を正確に押さえる
  • 集計対象の日付が「標準日付」か「農事日付」かを問題文で確認する
  • 日々変動する基準(ここでは日出時刻)が集計範囲に影響を与える点に注意する

設問1(3)〔観測データの分析〕について答えよ。

図3中の(c)〜(e)に入れる適切な字句を答えよ。
模範解答
c:14.0 d:15.0 e:16.0
解説

問題の論点整理

SQL2 は、SQL1 の結果(図2)を基に、AVG(日平均温度) OVER(ORDER BY 農事日付 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)を使って「3 日移動平均」を求める点がポイントです。
図2 の「日平均温度」を日付順に並べ、当該行とその直前2行の合計を3で割った値を X 列に表示します。

模範解答(c~e の値)

変数対象日付計算式
c2023-02-05(10.0 + 12.0 + 20.0) / 314.0
d2023-02-07(20.0 + 10.0 + 15.0) / 315.0
e2023-02-09(15.0 + 14.0 + 19.0) / 316.0

なぜこの値になるか

  1. 「ROWS BETWEEN 2 PRECEDING AND CURRENT ROW」は、
    • 当該行(今日)
    • 直前1行(昨日)
    • 直前2行(一昨日)
      の計 3 行を範囲とする。
  2. 図2 の「日平均温度」(小数第1位まで表示)から、対象日付を抽出:
    農事日付日平均温度
    2023-02-019.0
    2023-02-0214.0
    2023-02-0310.0
    2023-02-0412.0
    2023-02-0520.0
    2023-02-0610.0
    2023-02-0715.0
    2023-02-0814.0
    2023-02-0919.0
    2023-02-1018.0
  3. c(2023-02-05)の場合:一昨日~当日=02-03~02-05 の値
    (10.0 + 12.0 + 20.0) ÷ 3 = 14.0
  4. d(2023-02-07)の場合:02-05~02-07 の値
    (20.0 + 10.0 + 15.0) ÷ 3 = 15.0
  5. e(2023-02-09)の場合:02-07~02-09 の値
    (15.0 + 14.0 + 19.0) ÷ 3 = 16.0

受験者が誤りやすいポイント

  • 「2 PRECEDING」は“直前2行まで”を指し、「3 行分」ではないと誤解しがち
  • 範囲に行数指定がないときの動作(UNBOUNDED PRECEDINGなど)と混同する
  • 平均の分母はデータ件数(ここでは常に 3)である点
  • 小数第1位まで丸める点を忘れると表示と一致しない

試験対策ポイント

  • ウィンドウ関数の OVER(...)ROWS BETWEEN の意味を正確に理解する
  • 移動平均や累積計算では、範囲(PARTITION, ORDER BY, ROWS)を意識する
  • 平均値の分母、NULL 行の扱い、表示フォーマット(小数位)を押さえる
  • 図表から数値を読み取る演習を繰り返し、手計算でもすばやく答えを導けるようにする

以上の流れで「c:14.0」「d:15.0」「e:16.0」が導出できます。 window 関数の理解を深め、移動平均の計算ロジックを確実に習得しましょう。

設問1(4)〔観測データの分析〕について答えよ。

図5中の(f)〜(h)に入れる適切な字句を答えよ。
模範解答
f:日平均温度 g:圃場ID h:・農事日付   ・圃場ID, 農事日付
解説

模範解答のキーワード整理

図5(表5)の未完成 SQL3 中で,ウィンドウ関数の SUM に当てはまる部分は次のとおりです。
位置模範解答
f日平均温度
g圃場ID
h・農事日付
・圃場ID, 農事日付(※)
※ 「PARTITION BY □g□ を省略し,ORDER BY に 両方を指定する」運用を許容する回答です。

なぜその解答になるのか

  1. 「日平均温度」=f
    SQL3 の SUM 部分は,積算温度を“日平均温度を合計”する処理です。問題文でも
    「積算温度は,1日の平均温度をある期間にわたって合計したもの」
    とあり,“合計する対象”としてふさわしいのは「日平均温度」です。
  2. 「圃場ID」=g
    積算温度は圃場ごとに求めるため,ウィンドウ関数では同じ圃場内での累計を計算しなければなりません。
    SQL3 の OVER 句にある
    PARTITION BY □g□
    
    の指定列には「圃場ID」を入れます。
  3. 「農事日付」または「圃場ID, 農事日付」=h
    ウィンドウ関数の ORDER BY 句は「累積の並び順」を指定します。問題の SQL3 では
    OVER(... ORDER BY □h□ ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    
    とあり,期間を日付単位で累積したいので「農事日付」を指定します。
    • PARTITION BY を使うなら,ORDER BY は「農事日付」だけでよい
    • PARTITION BY を使わないなら,ORDER BY で「圃場ID, 農事日付」とすることで同様に圃場単位・日付順の累計を実現できます。

受験者が誤りやすいポイント

  • ウィンドウ関数の PARTITION BY と ORDER BY の役割を取り違える
    「同じ圃場内で計算を区切る」のは PARTITION BY,「その中を日付順に並べて累計する」のは ORDER BY です。
  • f に「分平均温度」など別の列名を入れる
    問題文で「日平均温度を合計したものが積算温度」と明示されています(表5には WITH R(…日平均温度…)とあります)。
  • ORDER BY で「圃場ID」を入れ忘れる
    PARTITION BY と ORDER BY を併用せずに「ORDER BY 農事日付」のみで済ませると,他圃場のデータが混ざりかねません。

試験対策ポイント

  • ウィンドウ関数の書式:
    SUM(対象列) 
      OVER (
        PARTITION BY 区切り列
        ORDER BY 並び順列
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
      )
    
    をしっかり覚える。
  • 累計処理では
    ・PARTITION BY で「グルーピング」
    ・ORDER BY で「累積の順序」
    を明確に分けて使う。
  • SQL3 の前段 WITH R は,表3 の SQL1 結果(圃場ID, 農事日付, 日平均温度, 行数)を受けていることを意識する。
以上のポイントを押さえれば,図5 中の(f)〜(h) を正しく埋めることができます。

設問2(1)〔“観測” テーブルの区分化〕について答えよ。

C さんは, 区分方法としてハッシュ区分を採用しなかった。 その理由を 35字以内で答えよ。
模範解答
・区分を追加する都度,全体の行の再分配が必要になるから ・同じ圃場に異なる圃場の観測データが混在する可能性があるから ・レンジ区分でも区分の行数をほぼ同じにする利点が得られるから
解説

模範解答のキーワード・論点

  • 「全行を再分配が必要」:ハッシュ区分は区分数変更時に全行を再配分する
  • 「観測データの混在」:同一圃場のデータが複数区分に分散される
  • 「レンジ区分の利点」:年度ごとの区分追加で行数の偏りを抑えられる

解答となる理由

  1. ハッシュ区分の場合
    「ハッシュ区分: 区分数を変更する場合, 全行を再分配する。」
    とあり、区分を追加するたびに既存のすべての行を再配置しなければなりません。
    これは、新たに圃場を追加するたびに大きな負荷と運用ダウンタイムを招きます。
  2. データの混在リスク
    ハッシュ区分では、同じ圃場IDの値でもハッシュ計算結果により異なる区分に振り分けられるため、
    「同じ圃場に異なる圃場の観測データが混在する可能性がある」
    といった管理上の問題が生じます。
  3. レンジ区分でも分散が可能
    レンジ区分では年度ごとに区分を切り替えられ、
    「レンジ区分では, 区分キーの値の範囲が既存の区分と重複しなければ区分を追加でき, 任意の区分を切り離すこともできる。」
    ため、運用時に行数の偏りを抑えつつ、履歴削除や新年度開始の処理が容易です。
以上を合わせて、ハッシュ区分よりもレンジ区分を採用するのが適切です。

受験者が誤りやすいポイント

  • 「ハッシュ区分は均等分散される」の誤解
    → 分散自体は均等でも、区分追加時に既存行を再配置するコストを見落としやすい
  • 「キーを複数指定すれば特定区分に集約できる」の誤解
    → 圃場IDをキーにしても、ハッシュとレンジでは運用特性が異なる

試験対策として覚えておくべきポイント

区分方法特徴運用時の留意点
レンジ区分範囲指定で追加・切離し可能
再編成不要
区分追加・削除時にログも小規模
ハッシュ区分キーのハッシュ値で均等分散区分数変更時に全行再分配が必須
  • 区分追加・削除時の「再分配」要否を必ず確認する
  • データの「混在リスク」と「運用負荷」を切り分けて考える
  • 試験では「性能要件」と「運用要件」の観点で区分方法を比較する問題が頻出
以上を押さえておくと、ハッシュ区分を避けてレンジ区分を選択した理由を論理的に説明できます。

設問2(2)〔“観測” テーブルの区分化〕について答えよ。

表6中の(ア)に入れる適切な数値を答えよ。
模範解答
ア:9,000
解説

模範解答の論点整理

  • 読込み行数(144,000行)は問題文「表6 …読込み行数」から得られる。
  • 区分化前後で異なるのは ページ当たりの行数
    • 区分化前:4行/ページ
    • 区分化後:16行/ページ
  • 読込みページ数 は次式で求める:
    読込みページ数 = 読込み行数 ÷ ページ当たりの行数

なぜ「ア=9,000」となるか

表6 の情報を引用しながら計算します。
比較項目区分化前区分化後
ページ当たりの行数4行(4,000バイト)16行(16,000バイト)
読込み行数144,000行144,000行
読込みページ数144,000ページアページ
  1. 区分化後の ページ当たりの行数 は「16行」
  2. 読込み行数は「144,000行」
  3. よって
    読込みページ数 = 144,000行 ÷ 16行/ページ = 9,000ページ
    
  4. したがって、アに入る数値は 9,000 となります。

受験者が誤りやすいポイント

  • 「ページ当たりの行数」を逆に用いてしまい、
    4行で割ってしまう(144,000÷4=36,000)
  • 「ページ長(バイト数)」と混同して計算してしまう
  • 割り切れない場合の切り上げ/切り捨ての扱いを忘れる
    • 本問では144,000÷16が整数なので問題になりませんが、実務では余りが出ると最終ページ分を+1ページする必要があります。

試験対策として覚えておくべき知識

  1. ページ当たり行数 は表領域のページ長 ÷ 1行の平均バイト数 で求める。
  2. 読み込みページ数 は「読み込む行数」を「ページ当たり行数」で割って求める(余りは実際には+1ページとなる)。
  3. パーティショニング(区分化)によって、対象データだけを格納する領域が連続化され、「1ページに格納できる行数」も変化するため、I/O量が大幅に削減される。
  4. 問題文中の表や条件は必ず正確に引用し、どの数値を使うべきかを見誤らないよう注意すること。

設問2(3)〔“観測” テーブルの区分化〕について答えよ。

区分化前では,副次索引から1行を読み込むごとに, なぜ表領域の1ページを読み込む必要があるか。 その理由を30字以内で答えよ。 ただし, 副次索引の索引ページの読込みについては考慮しなくてよい。
模範解答
同じ圃場の行は,1ページに1行しか格納できないから
解説

模範解答のキーワードと論点整理

  • キーワード
    • 「同じ圃場の行は,1ページに1行しか格納できない」
    • 主索引の並び順と表領域のページ当たり行数
    • 副次索引アクセス時の行→ページの1対1対応
  • 論点
    1. 表領域のページ当たり行数は「4行/ページ」である。
    2. 主索引(クラスタ化索引)が (観測日付, 観測時分, 圃場ID) の順で格納されており、同一の圃場ID をまとめて格納できる位置にはならない。
    3. その結果、ある圃場ID のデータを副次索引で順次読み込んでも、目的行は必ず別々のページに散在し、1行取得につき1ページ読込が必要になる。

解答の論理的な説明

1. ページ当たり行数の確認

問題文の「表2 “観測”テーブルの主な列統計…表領域の設定」によれば、
ページ当たり行数:4行/ページ
(ページ長:4,000バイト)
とあります。1ページに最大4行格納できることが前提です。

2. 主索引の並び順と格納順序

同じ表2から、主索引(クラスタ化索引)が以下の順序で定義されています。
主索引(列の定義順)
1. 観測日付
2. 観測時分
3. 圃場ID
主索引の順序でデータ行が物理的に配置されるため、まず「観測日付→観測時分」でまとまり、その中で「圃場ID」が並びます。
つまり、同じ圃場ID の行が連続してまとまるわけではなく、各分刻みの時刻について 1,000 圃場分の行が並び、その中で圃場ID が分散して格納されます。

3. 副次索引アクセス時の行→ページ対応

副次索引は「圃場ID」を先に持ち、目的の行を特定しますが、実際のデータ取得時には主索引順で格納された表領域ページを参照します。
したがって、
  • ある分刻み時刻における 1,000 圃場ID の行は最大で 1,000÷4 = 250 ページにまたがる
  • その中から特定の圃場ID の行を得るには、その行が存在するページを1ページずつ読み込む必要がある
以上より、同一圃場ID の連続した複数行であっても、1ページに1行しかない状態になり、結果として「1行読み込み=1ページ読み込み」を繰り返すことになります。
「同じ圃場の行は,1ページに1行しか格納できないから」

受験者が誤りやすいポイント

  • 「4行/ページ」だから本来は4行まとめて読めるはずと考えがち
    → しかし主索引順が (観測日付, 観測時分, 圃場ID) で、目的の 圃場ID が連続する位置にはまとまっていない点に要注意。
  • 副次索引からのアクセス効率を単純な行数÷行/ページで計算しないこと
    → 実際の読込みページ数は“行の物理分布”に依存します。

試験対策ポイント

  • クラスタ化索引(主索引)のキー順序が物理配置に与える影響を理解する
  • 非クラスタ化索引(副次索引)からのアクセスでは、目的行の物理的なページ位置を必ず確認する
  • ページ当たり行数だけでアクセスコストを見積もらず、「行のまとまり(クラスタリング)」を考慮する
  • 表領域・ページ分割、索引構造とアクセスパスの関係を定着させる

設問2(4)〔“観測” テーブルの区分化〕について答えよ。

区分化後の年末処理の期限は,なぜ 12月31日の24時ではなく元日の日出時刻なのか。 その理由を35字以内で答えよ。
模範解答
元日の日時刻までもデータは前日の農事日付に含まれるから
解説

キーワードと論点整理

  • 農事日付:
    「日出時刻から翌日の日出時刻の1分前までとする日付」を指す
  • 年末処理の期限:
    区分化後の“観測”テーブルで不要データを削除するタイミング

解答に至る理由

問題文には次の記述があります。
「日出時刻から翌日の日出時刻の1分前までとする日付を, 農事日付という。」
つまり、たとえば12月31日の農事日付は
「12月31日の日出時刻」から
「1月1日の日出時刻の1分前」までを含むため、
元旦0時をまたいで日出時刻まで観測データが当該農事日付に含まれます。
よって、不要データの削除期限を「12月31日24時」までにすると、
1月1日0時以降の日出時刻までのデータが削除対象に含まれず、
正しく農事日付単位で処理できなくなります。

受験者が誤りやすいポイント

  • 「日付=0時0分から23時59分」と誤解しがち
    → 本システムでは農事日付が日出基準で定義されている点を確認
  • 年末処理の期限とカレンダー更新のタイミングを混同しやすい
    → 削除対象と次年度区分追加の順序を整理する

試験対策として押さえるべき知識

  • 農事日付の定義(問題文〔1.(4)〕)
  • 区分化後の年末処理手順(問題文 表7)
  • RDBMSでの日付や期間を扱う際の区切り条件設定の重要性

設問2(5)〔“観測” テーブルの区分化〕について答えよ。

表7中の(イ)〜(カ)に入れる手順を,それぞれ次の①〜⑤の中から一つ選べ。①〜⑤が全て使われるとは限らない。ただし, バックアップの取得と索引の保守については考慮しなくてよい。 ① “圃場カレンダ” から古い行を削除する。 ② “圃場カレンダ” を再編成する。 ③ “観測” から古い行を削除する。 ④ “観測” を再編成する。 ⑤ “観測” から古い区分を切り離す。
模範解答
イ:① ウ:④ エ:⑤ オ:① カ:②
解説

模範解答のキーワード・論点整理

  • 外部キー制約のON DELETE CASCADE
    「FOREIGN KEY(観測日付, 圃場 ID)REFERENCES 圃場カレンダ(標準日付, 圃場 ID)ON DELETE CASCADE」
  • 非区分化テーブルの削除→再編成
    「行を削除してできた領域は, 行の挿入に使われない」「再編成では, 削除されていない全行を…再ロード」
  • 区分化テーブルのパーティション切り離し
    「レンジ区分…任意の区分を切り離すこともできる。区分を切り離したとき, 当該区分の分割索引も切り離される」
  • 年末処理の対象
    5年以上前の不要な行を「効率よく削除し, 表領域を有効に利用する」

解答の理由

まず,表7の手順を整理します。
区分化前区分化後
期限特になし元旦の日出時刻
手順1. “圃場カレンダー” に翌年の行を追加する。
2. (イ)
3. “圃場カレンダー” を再編成する。
4. (ウ)
1. “圃場カレンダー” に翌年の行を追加する。
2. “観測” に翌年度の区分を追加する。
3. (エ)
4. (オ)
5. (カ)

1) 非区分化(区分化前)の処理

  • (イ)で行うべきは,「5年以上前の不要な行を削除」することです。
    → 選択肢①「“圃場カレンダー”から古い行を削除する」を実行すると,
    • 「ON DELETE CASCADE」により,対応する“観測”の古い行も自動で削除されます。
  • (ウ)で行うべきは,削除により生じた空き領域を回収して表領域を有効活用することです。
    → 選択肢④「“観測”を再編成する」を実行すると,「再編成では, 削除されていない全行を…再ロード」し,空き領域を消去できます。
以上より,区分化前は
(イ)→①,(ウ)→④

2) 区分化後の処理

区分化後は,パーティション単位で古いデータを一気に除去できるため,観測テーブル本体を削除/再編成せずに「区分の切り離し」で済みます。
  • (エ)で行うべきは,古い年度の区分を取り除くこと。
    → 選択肢⑤「“観測”から古い区分を切り離す」
  • (オ)で行うべきは,パーティション切り離し後に残る“圃場カレンダー”の古い行を削除すること。
    → 選択肢①「“圃場カレンダー”から古い行を削除する」
  • (カ)で,その“圃場カレンダー”表領域を再編成し,削除後の空き領域を回収します。
    → 選択肢②「“圃場カレンダー”を再編成する」
以上より,区分化後は
(エ)→⑤,(オ)→①,(カ)→②

選択肢の注意点・誤りやすいポイント

  • 「観測から古い行を削除する(③)」を選ぶと,非区分化時に直接“観測”へ DELETE を発行するため,削除した行の空き領域は最後のページ以外使われず,表領域を有効活用できません。
  • 「圃場カレンダーを再編成する(②)」は,非区分化時には観測テーブルに適用できないため,ウには選べません。
  • 区分化後の年末処理では,「観測を再編成する(④)」は不要です。むしろ「区分を切り離す(⑤)」が最も高速かつログレコードも出さない方法です。

試験対策のポイント

  1. ON DELETE CASCADE の仕組み
    → 親テーブル(圃場カレンダー)の削除で子テーブル(観測)が自動的に削除される。
  2. 再編成(REORG)の効果
    → 削除後に残る空き領域を詰めることで,表領域を再利用可能にする。
  3. レンジ区分の運用
    → 区分の追加・切り離しはログを最小化し,特定期間のデータ保守が容易になる。
  4. 年末処理設計
    → 非区分化なら DELETE+REORG,区分化なら PARTITION の切り離し+親テーブル整理,というパターンを押さえる。
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ