忍者ブログ
データベースエンジニアのための実践ブログ。Oracle・PostgreSQL・MySQLなどの環境構築、実行計画の読み方やチューニングといった現場で役立つノウハウ、DB基礎知識までを発信しています。

【データベースの知識】結合(JOIN)アルゴリズムの選択と最適化


データベースを扱う上で避けて通れないのが「テーブル結合(JOIN)」です。SQLを書けば結果は同じに見えますが、内部のアルゴリズム選択ひとつで、処理速度は100倍、1000倍と劇的に変わります。今回は実務で役立つ3つの主要アルゴリズムを解説します。

1. 主要な3つの結合アルゴリズム

【 基本 】 データベースが2つのテーブルを繋ぐ際、主に以下の3つの手法から最適なものを選択します。それぞれ「得意なデータ量」と「リソースの使い方」に明確な違いがあります。

★ Nested Loop Join(入れ子ループ法)
外側の表から1行ずつ取り出し、内側の表を走査して一致を探します。少量のデータに強く、インデックスの活用が前提となります。
★ Sort Merge Join(ソートマージ法)
両方の表を結合キーでソートし、端から順に突き合わせます。大量データに強く、不等号結合(<, >)でも利用可能です。
★ Hash Join(ハッシュ結合)
片方の表からメモリ上にハッシュテーブルを作り、もう片方と突き合わせます。大量データ同士の等価結合(=)において非常に強力です。

2. 特徴比較表:データ量とインデックス

【 ポイント 】 実行計画を確認する際、現在のデータ量に対して適切な方法が選ばれているかを判断する基準を持っておくことが重要です。

アルゴリズム得意なデータ量インデックス備考
Nested Loop 1件〜少量 必須 オンライン処理の基本
Sort Merge 大量データ あれば尚可 ソートのCPU負荷あり
Hash Join 大量データ 不要 メモリ(ワークエリア)を消費

3. パフォーマンス改善:DBへの介入術

通常、DBは統計情報を元に自動で判断しますが、判断を誤ることもあります。その際、エンジニアが特定のアルゴリズムを強制・誘導する方法は製品ごとに異なります。

[ 製品別の介入方法 ]
★ Oracle(ヒント句):/*+ USE_NL(a b) */ のように、SQL内に直接指示を書き込みます。
★ PostgreSQL(パラメータ):SET enable_mergejoin = off; 等で特定の機能を無効化し誘導します。
★ MySQL(インデックスヒント):USE INDEX を指定することで、間接的にNLJなどへ誘導します。


結合アルゴリズムの仕組みを知ることは、スロークエリの根本原因を特定し、最適なパフォーマンスを引き出す第一歩となります。


PR

【OSS-DB Silver対策】標準で作成されるデータベース


OSS-DB Silver試験対策シリーズ、今回はデータベースクラスタを作成した際に「最初から用意されているデータベース」についてです。名前を正確に覚えることが得点に直結します。

1. 3つの事前定義データベース

【 基本 】 PostgreSQLでデータベースクラスタ(initdb)を作成すると、以下の3つのデータベースが自動的に作成されます。それぞれの役割を整理しておきましょう。

★ postgres:ユーザやアプリケーションが最初に接続するためのデフォルトデータベース。
★ template1:新しくデータベースを作成する際の「雛形」となるテンプレート。
★ template0:システムが使用する純粋なテンプレート。通常、ユーザはこれを変更しません。

2. 試験対策問題:4択チェック

【 問題 】 PostgreSQLのデータベースクラスタ作成時に、標準で作成される「事前定義されたデータベース」の組み合わせとして正しいものはどれですか?

問題:事前定義されているデータベース名をすべて含んでいるものを選びなさい。

1. master, temp, model

2. template0, template1, postgres

3. template, default, public

4. system, user, template1

3. 正解と解説

正解:2

【 解説 】
理解のコツ: template0 と template1 は数字が含まれる点に注意しましょう。また、接続先となるのは postgresql ではなく postgres であるという綴りの違いも試験で狙われやすいポイントです。
復習の視点: CREATE DATABASE コマンドを実行したとき、実は裏側で template1 の内容がコピーされています。そのため、template1 に共通の拡張機能などを入れておくと、新規DB作成時に自動で反映されるようになります。


4. まとめ

「template0, template1, postgres」。この3つの名前はセットで暗記してしまいましょう。一見地味な知識ですが、こうした基礎を完璧にすることが、OSS-DB Silver合格への確実なステップになります!

【Oracle復習】SELECT結果を変数に代入!SELECT INTOを使いこなす


Oracle復習シリーズ、今回はSQLとPL/SQLを繋ぐ重要なステップ「SELECT INTO」です。データベースから取得した値を変数に格納する方法を確認しましょう。

1. 文法:SELECT ・・・ INTO 変数

【 基本 】 SQLで取得したデータを変数に代入するには、`SELECT`句と`FROM`句の間に `INTO` キーワードを挟みます。これにより、クエリの結果をPL/SQL内で扱えるようになります。

[ 文法のポイント ]
★ INTO 変数名:取得した列の値を格納する変数。型を合わせる必要があります。
★ SYSDATE:Oracleの擬似列。サーバーの現在日付を取得します。
★ DUAL:1行だけを返す便利なダミーテーブルです。

2. サンプル:現在日付を変数に格納する

【 コード 】 変数 `myDate` を宣言し、そこに `SYSDATE` の結果を代入して出力するプログラムです。

DECLARE
  myDate DATE;
BEGIN
  SELECT SYSDATE INTO myDate FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(myDate);
END;
/

3. 実行結果:日付の出力

2026/04/11 07:49:18(※実行時の現在日付)

Oracle Live SQLの「DBMS output」タブに、取得した現在日付が表示されます。

4. 解説:SELECT INTO の注意点

1. 理解のコツ: `SELECT INTO` は、必ず「1行だけ」が返ってくるクエリである必要があります。0行だったり、2行以上返ってきたりするとエラーになるため注意しましょう。
2. 復習の視点: 実務では、テーブルの列定義と同じ型を自動で適用してくれる `%TYPE`(例:`myDate emp.hiredate%TYPE;`)を併用すると、型の不一致を防げてより安全なコードになります。


5. まとめ

「データベースから値を持ってきて、変数に記憶させる」。これができれば、取得した値を使って条件分岐させたり、別のテーブルにINSERTしたりと、処理の幅がぐっと広がります。Oracle Live SQLならDUAL表ですぐに試せるのが嬉しいですね!


【Oracle復習】PL/SQLの変数宣言と代入!「HELLO WORLD」を変数で扱う


Oracle復習シリーズ、今回は「変数」の扱いです。PL/SQL特有の宣言方法や、代入演算子の書き方を確認し、文字列を変数に入れて出力してみましょう。

1. 文法:変数の定義と代入ルール

【 基本 】 PL/SQLでは、実行部の前にある `DECLARE` セクションで変数を宣言します。また、代入には `=` ではなく `:=` を使用するのが最大の特徴です。

[ 文法のポイント ]
★ DECLARE:変数の名前と型を定義する場所。
★ VARCHAR2(size):可変長文字列型。サイズ指定が必須です。
★ := (代入演算子):右辺の値を左辺の変数に格納します。

2. サンプル:変数を使った出力

【 コード 】 `message` という変数を用意し、そこに文字列を格納してから出力するプログラムです。

DECLARE
  message VARCHAR2(20);
BEGIN
  message := 'HELLO WORLD';
  DBMS_OUTPUT.PUT_LINE(message);
END;
/

3. 実行結果:格納された値の表示

HELLO WORLD

Oracle Live SQLの「DBMS output」タブに、変数に格納された文字列が表示されます。

4. 解説:PL/SQLらしい書き方

1. 理解のコツ: 他の言語(CやJava)では `=` で代入することが多いですが、PL/SQL(Pascal由来)では `:=` を使います。比較演算子の `=` と区別するための伝統的な書き方です。
2. 復習の視点: 変数宣言時に `message VARCHAR2(20) := 'HELLO WORLD';` と書くことで、宣言と同時に初期化することも可能です。コードを短くしたい時に便利ですね。


5. まとめ

「箱(変数)を用意して、名前を付け、中身を入れる」。プログラミングの基本ですが、:= という記号に慣れることがPL/SQL習得の第一歩です。次は、この変数を使って計算や条件分岐に挑戦していきましょう!

【データベース:Oracle復習】PL/SQL Oracle Live SQLで「Hello World」を出力する


Oracle復習シリーズ、今回はプログラミングの第一歩「Hello World」です。環境構築不要の Oracle Live SQL を使って、画面に出力する基本を確認しましょう。

1. サンプル:標準出力の基本

【 コード 】 PL/SQLで文字列を出力するには、`DBMS_OUTPUT.PUT_LINE` を使用します。今回は宣言部(DECLARE)を使わない、最もシンプルな無名ブロックで実行します。

BEGIN
   DBMS_OUTPUT.PUT_LINE('hello world') ;
END ;
/

2. 実行結果:出力タブの確認

hello world

Oracle Live SQLでは、実行後に画面下部の「DBMS output」タブをクリックすることで、上記の結果を確認できます。

3. 解説:DBMS_OUTPUTパッケージ

PL/SQLには、デバッグや結果確認のために標準で用意されているパッケージがあります。それが `DBMS_OUTPUT` です。

[ 構成要素の整理 ]
★ DBMS_OUTPUT:Oracleが標準提供するパッケージ名。
★ PUT_LINE:中身を出力して改行するプロシージャ(手続き)。
★ ' (シングルクォート):文字列を囲む際に使用。ダブルクォートではない点に注意。

1. 理解のコツ: `DBMS_OUTPUT.PUT_LINE` は、Javaの `System.out.println` や Pythonの `print` に相当します。開発中の変数の値を確認する際など、もっとも多用するツールの一つです。
2. Live SQLの視点: 通常のSQL*Plusなどでは `SET SERVEROUTPUT ON` というコマンドが必要ですが、Live SQLは自動で出力をキャッチしてくれるので、学習には最適の環境ですね。


4. まとめ

「hello world」が表示された瞬間、データベースとの対話が成立したことになります。これが全ての複雑な処理の出発点。次はこの出力機能を使って、計算結果やデータの中身を表示させていきましょう!