Db2にAI エディションが登場
Db2 for Linux, Unix, Windows v12.1.4リリースに伴い、AI機能が強化された新しいエディションが登場しました。
Db2 AI エディションと呼ばれており、Db2 AI Advanced, Db2 AI Standard, Db2 AI Communityの各エディションがあります。
このエディションでは、AIによって日常のDb2運用管理業務の生産性向上が図れるように設計されています。
主たる機能は、拡張されたデータベース管理コンソールであるIBM Db2 Genius Hubを通じて提供され、この強化されたコンソールは、従来のDb2 Intelligence Centerの後継となるものです。
フル機能のDb2 Genius Hubは、Db2 AI エディションのうち、Db2 AI AdvancedおよびDb2 AI Standardエディションのみに同梱されています。
Db2 Genius Hubの無料評価版(後述)は30日間のみフル機能が利用できます。
IBM Db2 Genius Hubとは?
IBM Db2 Genius Hubは、Db2の運用管理を効率化し、パフォーマンスを向上させ、運用管理の複雑さを低減することを目的とした、AIドリブンなデータベース管理コンソールで、インターフェースはWebベースです。
先進的なモニタリング、AI搭載のトラブルシューティング、クエリ最適化を統合したソリューションで、Db2の運用管理を簡素化し、加速させるために、インテリジェントな推奨事項、データに関する洞察、そしてデータ品質、パフォーマンスのチューニングを自動化するためのツールも提供します。
データ専門家とデータベース管理者の両方を対象に設計されており、AI搭載の可観測性(observability)とガイダンスを提供し、データベース管理を簡素化し、より良い意思決定を推進します。
最先端のAI技術を活用することで、初心者、入門者を含む様々な経験レベルのデータベース管理者、専門家がDb2をより効率的に管理でき、運用コストやリスクを軽減します。
Db2 Genius HubのAIスタックは「持ち込み」も可能
Db2 Genius Hubにおいて、AIスタックは、自然言語理解、SQL生成、パフォーマンス分析、データベースとの対話型インタラクションなど、あらゆるインテリジェント機能を支えています。AIスタックの構成については2つの選択肢(後述)が用意されており、以下の点に影響します。
データの処理場所:IBMのマネージドサービス上か、お客様のインフラストラクチャ上か
使用するAIモデル:IBMマネージドモデルか、お客様が選択したモデルか
課金方法:AIトークン(後述)ベースの従量課金か、固定インフラストラクチャ費用か
お客様の運用責任:完全マネージドか、セルフマネージドか
データプライバシーとコンプライアンス:共有インフラストラクチャか、完全なデータ主権か
Db2 Genius Hubは、AIスタックにおいて、2つの異なるAI構成アプローチをサポートし、どちらかを選択可能です。
1)IBM提供のAIスタックを利用する(Managed service)
IBMが提供するAIスタックは、Db2エージェントAI機能を支える、フルマネージド型のエンタープライズグレードAIインフラストラクチャです。IBMがAIインフラストラクチャのあらゆる側面を管理するため、お客様はデプロイ、スケーリング、メンテナンスを気にすることなく、AI機能の利用に集中できます。こちらの構成ではAIトークンが必要です。主な特徴は次のとおりです。
AIモデル:Anthropic Claude Sonnet 4と4.5
ナレッジベース:ドキュメント検索のためのElasticsearch
課金:AIトークンベースの従量課金制
メンテナンス:自動アップデートとパッチ適用
セットアップ不要:AIをすぐに利用可能
自動アップデート:常に最新モデルを使用
従量課金制:AIトークンベースの課金
エンタープライズサポート:SLAに基づく24時間365日のサポート
マルチリージョン:グローバルな可用性
「IBM提供のAIスタックを利用する」が適するケース:
迅速な導入、多様なワークロード、マネージド・オペレーション
インフラストラクチャの管理に時間を費やすことなく、AIの活用に集中したいお客様
2)独自のAIスタックを持ち込む(Self-managed)
「独自のAIスタックを持ち込む」機能を使用すると、オンプレミス環境またはお好みのクラウド環境に独自のAIインフラストラクチャをデプロイおよび管理できます。Db2のエージェント型AI機能を活用できるだけでなく、AIモデル、データ処理、インフラストラクチャも制御できます。主な特徴は次のとおりです。
完全な制御:モデルとインフラストラクチャを自由に選択できます
データプライバシー:すべてのデータはお客様の環境内に保持されます
固定コスト:AIトークンベースの従量課金制ではないため、予測可能なコスト
カスタマイズ:お客様のドメインに合わせてモデルを微調整できます
エアギャップ:インターネット接続なしでデプロイできます
「独自のAIスタックを持ち込む」が適するケース:
データ主権、高負荷ワークロード、カスタム要件
厳格なコンプライアンス要件や高負荷ワークロードの場合
インターネット接続なし環境でのデプロイ
AIスタックの選択画面例(この例では「IBM提供のAIスタック」が選択されています)

「独自のAIスタックを持ち込む」場合、AI推論プロバイダーとして選択できるのは、"RHEL AI(vLLM)", "IBM watsonx.ai", "AWS Bedrock"のどれかになります(当記事執筆時において)

Db2 Genius Hub の主な機能
当記事執筆時のDb2 Genius Hubの主な機能は次の通りです。
(1)統合Db2管理
Db2 Genius Hub は、オンプレミス、ハイブリッド、またはクラウド上のすべての IBM Db2デプロイメントを管理するための、単一の統合コンソールを提供します。
(2)エージェント型AIアシスタント
AIアシスタントとチャットして、タスクの完了を支援したり、システムのステータスや統計情報を確認したり、Db2に関する一般的な質問ができます。
(3)ログ分析
ログ分析は、Db2診断ログを構造化して閲覧および解釈する方法を提供し、フィルタリング、時間範囲の選択、エラーや警告の追跡を可能にします。
(4)異常検出
異常検知は、通常の使用パターンを学習し、主要指標の異常を検出することで、データベース内の異常な動作を自動的に特定するアラートサービスです。
(5)深層モニタリングと迅速なトラブルシューティング
Genius Hubは、リアルタイムのメトリクス、インテリジェントなアラート、詳細なドリルダウン診断により、データベースの問題を迅速に診断し、解決します。ユーザーに影響が及ぼす前に異常を検出でき、ダウンタイムとパフォーマンス低下を大幅に削減します。
(6)スマートなクエリ最適化とパフォーマンスチューニング
Genius Hubは、実際の使用データとシステム動作に基づくインテリジェントなクエリ・チューニングの推奨を提供します。事後に常に対応するのではなく、能動的にパフォーマンスのボトルネックを低減できます。
(7)高度な自動化とスクリプト
Genius Hubは、集中化されたスクリプト管理、スケジューリング、バージョン管理を提供し、ワークフローに直接統合されています。また、日常的なメンテナンスやバックアップ、スキーマの更新などを自動化し、データベース管理者を繰り返しの手作業から解放します。
この回では、上記の中から"(2)エージェント型AIアシスタント"にフォーカスしてみます。
AIアシスタントでできること
AIアシスタントでできること自体もアシスタントに質問することができます。
AIアシスタントには何ができますか?
と質問してみると、この記事執筆時では下記のような回答が得られます。
こんにちは!私はDb2データベースに関する様々なサポートを提供できます。以下のような支援が可能です:
• Db2の知識と概念の説明 - Db2の機能、構成パラメータ、SQLの使い方、エラーコード、ベストプラクティスなど、公式ドキュメントに基づいた説明を提供します
• データベース状態の確認 - 現在のCPU使用率、実行中のクエリ、キューイングされたリクエスト、アプリケーション状態、データベースの健全性などの情報を取得します
• クエリチューニング - 特定のSQLクエリの最適化とパフォーマンス改善の推奨事項を提供します
• ストレージ分析と最適化 - ディスク使用状況の分析、テーブルスペースの最適化、reorg候補の特定、スペース再利用の機会を診断します
• パフォーマンス診断 - クエリのキューイング、ロック待機、スピリング、ボトルネック、トランザクションログの問題など、パフォーマンス問題の根本原因を特定し、解決策を提案します
• サポートチケットの準備 - IBM Db2サポートへエスカレーションが必要な場合、問題情報の収集と包括的なサポートチケット準備を支援します
Db2に関することでしたら、何でもお気軽にお聞きください!
このように、様々な問い合わせに対応するAIアシスタントですが、今回は、Db2初心者、入門者にとっては作成が難しいと思われるSQLをAIアシスタントに作ってもらいましょう。
表作成(CREATE TABLE), サンプルデータのINSERT、クエリ(SELECT)をAIアシスタントに代行させます。
2つの実行例を以下に示します。
お客様独自のAIスタックの持ち込みも可能なDb2 Genius Hubですが、今回はどちらも「IBM提供のAIスタックを利用する(Managed service)」構成で実行された例です。
例1:再帰SQLを使う部品表の作成と照会
AIアシスタントに次のシンプルな指示を与えます。
再帰SQLが利用可能な部品表をCREATE TABLEしてください。
作成されたTABLEのサンプルデータも作成してください。
作成された表のデータを照会するSELECT文も作成してください。
利用するSQLは、Db2 SQLです
下記のような回答を得られました。CREATE TABLE文に加え、検索パフォーマンス向上のためのCREATE INDEX文も生成してくれます(内部で生成AIのメカニズムを使っているため、出力内容に揺らぎがあるため、下記とは違う結果になることがあります。本記事執筆時において英語のみ正式にサポートされています。好ましい結果が得られなかった場合、英語での問い合わせをお試しください)。
ご要望いただいた再帰SQL(Recursive SQL)が利用可能な部品表(BOM: Bill of Materials)を作成しました。
この部品表は、製品の階層構造を表現するための設計で、親部品と子部品の関係を再帰的にクエリできます。
CREATE TABLE文、サンプルデータのINSERT文、そして再帰クエリを使用したSELECT文の3つを含む完全なSQLセットを提供します。
テーブルには部品ID、部品名、親部品ID、数量、単価などが含まれており、自己参照外部キーによる階層構造を実現しています。
-- ========================================
-- 1. CREATE TABLE: 部品表(BOM)の作成
-- ========================================
CREATE TABLE PARTS_BOM ( PART_ID VARCHAR(20) NOT NULL, PART_NAME VARCHAR(100) NOT NULL, PARENT_PART_ID VARCHAR(20), QUANTITY INTEGER NOT NULL DEFAULT 1, UNIT_PRICE DECIMAL(10,2), LEVEL_NUM INTEGER, DESCRIPTION VARCHAR(500), PRIMARY KEY (PART_ID), CONSTRAINT FK_PARENT_PART FOREIGN KEY (PARENT_PART_ID) REFERENCES PARTS_BOM(PART_ID) ON DELETE CASCADE );
-- インデックスの作成(検索パフォーマンス向上のため)
CREATE INDEX IDX_PARENT_PART_ID ON PARTS_BOM(PARENT_PART_ID);
-- ========================================
-- 2. INSERT: サンプルデータの挿入
-- ========================================
-- 階層レベル1: 最終製品(親なし)
INSERT INTO PARTS_BOM (PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, DESCRIPTION) VALUES ('BIKE-001', '自転車', NULL, 1, 50000.00, 1, '完成品の自転車');
-- 階層レベル2: 主要部品
INSERT INTO PARTS_BOM (PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, DESCRIPTION) VALUES ('FRAME-001', 'フレーム', 'BIKE-001', 1, 15000.00, 2, 'アルミニウム製フレーム'), ('WHEEL-001', '車輪セット', 'BIKE-001', 2, 8000.00, 2, '前輪と後輪のセット'), ('HANDLE-001', 'ハンドル', 'BIKE-001', 1, 3000.00, 2, 'ドロップハンドル'), ('SADDLE-001', 'サドル', 'BIKE-001', 1, 2500.00, 2, '快適なサドル'), ('BRAKE-001', 'ブレーキシステム', 'BIKE-001', 1, 5000.00, 2, '油圧ディスクブレーキ');
-- 階層レベル3: 車輪の部品
INSERT INTO PARTS_BOM (PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, DESCRIPTION) VALUES ('RIM-001', 'リム', 'WHEEL-001', 1, 3000.00, 3, 'アルミ製リム'), ('TIRE-001', 'タイヤ', 'WHEEL-001', 1, 2000.00, 3, '700x25Cタイヤ'), ('SPOKE-001', 'スポーク', 'WHEEL-001', 32, 50.00, 3, 'ステンレススポーク'), ('HUB-001', 'ハブ', 'WHEEL-001', 1, 2500.00, 3, '精密ベアリングハブ');
-- 階層レベル3: ブレーキシステムの部品
INSERT INTO PARTS_BOM (PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, DESCRIPTION) VALUES ('BRAKE-PAD-001', 'ブレーキパッド', 'BRAKE-001', 4, 500.00, 3, 'セラミック製パッド'), ('BRAKE-ROTOR-001', 'ブレーキローター', 'BRAKE-001', 2, 1500.00, 3, '160mmローター'), ('BRAKE-LEVER-001', 'ブレーキレバー', 'BRAKE-001', 2, 1000.00, 3, '油圧レバー');
-- 階層レベル4: ハブの細部部品
INSERT INTO PARTS_BOM (PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, DESCRIPTION) VALUES ('BEARING-001', 'ベアリング', 'HUB-001', 4, 300.00, 4, '高精度ベアリング'), ('AXLE-001', '車軸', 'HUB-001', 1, 800.00, 4, 'チタン製車軸');
-- ========================================
-- 3. SELECT: 再帰SQLクエリの例
-- ========================================
-- 【クエリ1】特定の部品から始まる全ての子部品を再帰的に取得(部品展開)
WITH RECURSIVE BOM_EXPLOSION ( PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, PATH, TOTAL_QUANTITY ) AS (
-- アンカーメンバー: 開始部品(ここでは自転車全体)
SELECT PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, UNIT_PRICE, LEVEL_NUM, CAST(PART_NAME AS VARCHAR(1000)) AS PATH, QUANTITY AS TOTAL_QUANTITY FROM PARTS_BOM WHERE PARENT_PART_ID IS NULL UNION ALL
-- 再帰メンバー: 子部品を取得
SELECT pb.PART_ID, pb.PART_NAME, pb.PARENT_PART_ID, pb.QUANTITY, pb.UNIT_PRICE, pb.LEVEL_NUM, CAST(be.PATH || ' > ' || pb.PART_NAME AS VARCHAR(1000)) AS PATH, be.TOTAL_QUANTITY * pb.QUANTITY AS TOTAL_QUANTITY FROM PARTS_BOM pb INNER JOIN BOM_EXPLOSION be ON pb.PARENT_PART_ID = be.PART_ID ) SELECT PART_ID, PART_NAME, PARENT_PART_ID, QUANTITY, TOTAL_QUANTITY, UNIT_PRICE, (TOTAL_QUANTITY * UNIT_PRICE) AS TOTAL_COST, LEVEL_NUM, PATH FROM BOM_EXPLOSION ORDER BY LEVEL_NUM, PART_ID;
-- 【クエリ2】特定の子部品から親をたどる逆再帰クエリ(部品がどこで使われているか)
WITH RECURSIVE BOM_WHERE_USED ( PART_ID, PART_NAME, PARENT_PART_ID, LEVEL_NUM, PATH ) AS (
-- アンカーメンバー: 開始部品(例: ベアリング)
SELECT PART_ID, PART_NAME, PARENT_PART_ID, LEVEL_NUM, CAST(PART_NAME AS VARCHAR(1000)) AS PATH FROM PARTS_BOM WHERE PART_ID = 'BEARING-001' UNION ALL
-- 再帰メンバー: 親部品をたどる
SELECT pb.PART_ID, pb.PART_NAME, pb.PARENT_PART_ID, pb.LEVEL_NUM, CAST(pb.PART_NAME || ' > ' || bw.PATH AS VARCHAR(1000)) AS PATH FROM PARTS_BOM pb INNER JOIN BOM_WHERE_USED bw ON pb.PART_ID = bw.PARENT_PART_ID ) SELECT PART_ID, PART_NAME, PARENT_PART_ID, LEVEL_NUM, PATH AS USAGE_PATH FROM BOM_WHERE_USED ORDER BY LEVEL_NUM;
-- 【クエリ3】階層レベル別の部品数と合計金額を集計
WITH RECURSIVE BOM_HIERARCHY ( PART_ID, PART_NAME, LEVEL_NUM, UNIT_PRICE, QUANTITY, PARENT_PART_ID ) AS (
-- アンカーメンバー SELECT PART_ID, PART_NAME, LEVEL_NUM, UNIT_PRICE, QUANTITY, PARENT_PART_ID FROM PARTS_BOM WHERE PARENT_PART_ID IS NULL UNION ALL
-- 再帰メンバー
SELECT pb.PART_ID, pb.PART_NAME, pb.LEVEL_NUM, pb.UNIT_PRICE, pb.QUANTITY, pb.PARENT_PART_ID FROM PARTS_BOM pb INNER JOIN BOM_HIERARCHY bh ON pb.PARENT_PART_ID = bh.PART_ID ) SELECT LEVEL_NUM AS 階層レベル, COUNT(*) AS 部品数, SUM(UNIT_PRICE) AS 単価合計, AVG(UNIT_PRICE) AS 平均単価, MIN(UNIT_PRICE) AS 最小単価, MAX(UNIT_PRICE) AS 最大単価 FROM BOM_HIERARCHY GROUP BY LEVEL_NUM ORDER BY LEVEL_NUM;
-- 【クエリ4】全ての部品とその直属の親部品名を表示(シンプルな結合クエリ)
SELECT child.PART_ID AS 部品ID, child.PART_NAME AS 部品名, child.QUANTITY AS 数量, child.UNIT_PRICE AS 単価, child.LEVEL_NUM AS 階層レベル, parent.PART_NAME AS 親部品名, child.DESCRIPTION AS 説明 FROM PARTS_BOM child LEFT JOIN PARTS_BOM parent ON child.PARENT_PART_ID = parent.PART_ID ORDER BY child.LEVEL_NUM, child.PART_ID; PARTS_BOM
テーブルを作成し、部品の階層構造を表現する7つのカラムと自己参照外部キー制約を定義しています自転車を例とした4階層の部品データ(最終製品→主要部品→細部部品→最小部品)を15件挿入しています
WITH RECURSIVEを使用した4つのクエリ例を提供:部品展開、逆再帰、階層別集計、親子結合を実装しています
例2:位置情報を含む表の作成と照会
次に、以下の簡素な指示をAIアシスタントに与えてみます。
Db2 Warehouseで位置情報を検索できる表をCREATE TABLE してください。
作成されたTABLEのサンプルデータも作成してください。
Db2地理関数を使って東京駅から半径1kmのレコードを参照するSELECT文も作成してください。
使用するSQLはDb2 Warehouse SQLです
下記の回答を得られました。こちらの例でもCREATE TABLE文だけでなく、検索パフォーマンス向上のためのCREATE INDEX文(地理空間インデックスの作成)も提示してくれます(内部で生成AIのメカニズムを使っているため、出力内容に揺らぎがあるため、下記とは違う結果になることがあります。本記事執筆時において英語のみ正式にサポートされています。好ましい結果が得られなかった場合、英語での問い合わせをお試しください)。
ご要望いただいたDb2 Warehouseで位置情報を検索できるテーブルのCREATE TABLE文、サンプルデータのINSERT文、そしてDb2地理関数を使用して東京駅から半径1km以内のレコードを参照するSELECT文を生成しました。
Db2の地理空間データ型(ST_POINT)と地理関数(ST_DISTANCE, ST_WITHIN, ST_BUFFER)を活用し、高度な位置情報検索を実現します。
テーブルには地理空間オブジェクトを格納するGEOLOCATIONカラム(DB2GSE.ST_POINT型)を含み、空間インデックスによる高速検索が可能です。
サンプルデータには東京駅周辺の実在する施設15件を挿入し、ST_DISTANCE関数による距離計算とST_WITHIN関数によるバッファー範囲検索の2つの方法を提供します。
-- ========================================
-- 1. CREATE TABLE: Db2地理空間データ型を使用した位置情報テーブルの作成
-- ========================================
CREATE TABLE GEO_LOCATION_DATA ( LOCATION_ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), LOCATION_NAME VARCHAR(200) NOT NULL, LOCATION_TYPE VARCHAR(50), ADDRESS VARCHAR(500), LATITUDE DOUBLE NOT NULL, LONGITUDE DOUBLE NOT NULL, GEOLOCATION DB2GSE.ST_POINT, POSTAL_CODE VARCHAR(10), PHONE_NUMBER VARCHAR(20), DESCRIPTION VARCHAR(1000), CREATED_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (LOCATION_ID) );
-- 地理空間インデックスの作成(検索パフォーマンス向上のため)
CREATE INDEX IDX_GEOLOCATION ON GEO_LOCATION_DATA(GEOLOCATION) EXTEND USING DB2GSE.SPATIAL_INDEX(0.5, 0, 0);
-- 通常のインデックス(緯度・経度での検索用)
CREATE INDEX IDX_LAT_LON ON GEO_LOCATION_DATA(LATITUDE, LONGITUDE); COMMENT ON TABLE GEO_LOCATION_DATA IS 'Db2地理空間データ型を使用した位置情報テーブル'; COMMENT ON COLUMN GEO_LOCATION_DATA.GEOLOCATION IS '地理空間オブジェクト(ST_POINT型)'; COMMENT ON COLUMN GEO_LOCATION_DATA.LATITUDE IS '緯度(北緯を正の値で格納)'; COMMENT ON COLUMN GEO_LOCATION_DATA.LONGITUDE IS '経度(東経を正の値で格納)';
-- ========================================
-- 2. INSERT: ST_POINT関数を使用したサンプルデータの挿入
-- ========================================
-- 東京駅そのもの(緯度 35.681236, 経度 139.767125)
-- ST_POINT(経度, 緯度, SRID) ※注意: 経度が先、緯度が後
-- SRID 4326 = WGS84 (GPS等で使用される標準測地系)
INSERT INTO GEO_LOCATION_DATA (LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, GEOLOCATION, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION) VALUES ( '東京駅', '鉄道駅', '東京都千代田区丸の内一丁目', 35.681236, 139.767125, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), '100-0005', '03-3212-2345', 'JR東日本の主要ターミナル駅' );
-- 半径1km以内の施設
INSERT INTO GEO_LOCATION_DATA (LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, GEOLOCATION, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION) VALUES
( '皇居', '観光地', '東京都千代田区千代田1-1', 35.685175, 139.752799, DB2GSE.ST_POINT(139.752799, 35.685175, 4326), '100-0001', '03-3213-1111', '日本の皇室の居住地' ),
( '日本橋', '観光地・商業地', '東京都中央区日本橋', 35.682839, 139.773551, DB2GSE.ST_POINT(139.773551, 35.682839, 4326), '103-0027', NULL, '江戸時代からの商業の中心地' ),
( '大手町ビル', 'オフィスビル', '東京都千代田区大手町一丁目6-1', 35.686777, 139.765371, DB2GSE.ST_POINT(139.765371, 35.686777, 4326), '100-0004', '03-3211-1111', '大手町の主要オフィスビル' ),
( '丸の内ビルディング', '商業施設', '東京都千代田区丸の内二丁目4-1', 35.680233, 139.764977, DB2GSE.ST_POINT(139.764977, 35.680233, 4326), '100-6390', '03-5218-5100', '丸の内の大型商業施設' ),
( '東京国際フォーラム', '会議施設', '東京都千代田区丸の内三丁目5-1', 35.676566, 139.763742, DB2GSE.ST_POINT(139.763742, 35.676566, 4326), '100-0005', '03-5221-9000', '国際的なイベント・会議施設' ),
( '新丸の内ビルディング', '商業施設', '東京都千代田区丸の内一丁目5-1', 35.682436, 139.765564, DB2GSE.ST_POINT(139.765564, 35.682436, 4326), '100-6590', '03-5218-5100', '丸の内の高層複合ビル' ),
( 'KITTE', '商業施設', '東京都千代田区丸の内二丁目7-2', 35.681686, 139.768234, DB2GSE.ST_POINT(139.768234, 35.681686, 4326), '100-0005', '03-3216-2811', '旧東京中央郵便局の商業施設' ),
( '和田倉噴水公園', '公園', '東京都千代田区皇居外苑3-1', 35.684264, 139.761256, DB2GSE.ST_POINT(139.761256, 35.684264, 4326), '100-0002', NULL, '皇居外苑の一部で噴水が有名' ),
( '日比谷公園', '公園', '東京都千代田区日比谷公園1-6', 35.673897, 139.757791, DB2GSE.ST_POINT(139.757791, 35.673897, 4326), '100-0012', '03-3501-6428', '日本初の洋風近代式公園' );
-- 半径1km以上離れた施設(比較用)
INSERT INTO GEO_LOCATION_DATA (LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, GEOLOCATION, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION) VALUES
( '東京タワー', '観光地', '東京都港区芝公園4-2-8', 35.658581, 139.745438, DB2GSE.ST_POINT(139.745438, 35.658581, 4326), '105-0011', '03-3433-5111', '東京のシンボルタワー(東京駅から約3.5km)' ),
( '浅草寺', '寺院・観光地', '東京都台東区浅草二丁目3-1', 35.714765, 139.796574, DB2GSE.ST_POINT(139.796574, 35.714765, 4326), '111-0032', '03-3842-0181', '東京最古の寺院(東京駅から約5km)' ),
( '秋葉原駅', '鉄道駅', '東京都千代田区外神田一丁目', 35.698683, 139.773003, DB2GSE.ST_POINT(139.773003, 35.698683, 4326), '101-0021', NULL, '電気街として有名なエリア(東京駅から約2.5km)' ),
( '上野駅', '鉄道駅', '東京都台東区上野七丁目1-1', 35.713768, 139.777254, DB2GSE.ST_POINT(139.777254, 35.713768, 4326), '110-0005', NULL, '北関東方面への玄関口(東京駅から約4km)' ),
( '品川駅', '鉄道駅', '東京都港区高輪三丁目26-27', 35.628391, 139.738698, DB2GSE.ST_POINT(139.738698, 35.628391, 4326), '108-0074', NULL, '東海道新幹線の主要駅(東京駅から約6km)' );
-- ========================================
-- 3. SELECT: Db2地理関数を使用した東京駅から半径1km以内のレコード検索
-- ========================================
-- 【方法1】ST_DISTANCE関数を使用した距離計算
-- ST_DISTANCE(地点1, 地点2, 単位) で2点間の距離を計算
-- 単位: 'KILOMETER', 'METER', 'MILE' など
SELECT LOCATION_ID, LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION, DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'KILOMETER' ) AS DISTANCE_KM, ROUND( DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'METER' ), 2 ) AS DISTANCE_METERS FROM GEO_LOCATION_DATA WHERE DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'KILOMETER' ) <= 1.0 ORDER BY DISTANCE_KM;
-- 【方法2】ST_WITHIN関数とST_BUFFER関数を組み合わせた範囲検索
-- ST_BUFFER(地点, 距離, 単位) で指定地点を中心とした円形バッファーを作成
-- ST_WITHIN(地点, バッファー) で地点がバッファー内にあるかを判定
SELECT LOCATION_ID, LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION, DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'KILOMETER' ) AS DISTANCE_KM FROM GEO_LOCATION_DATA WHERE DB2GSE.ST_WITHIN( GEOLOCATION, DB2GSE.ST_BUFFER( DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 1.0, 'KILOMETER' ) ) = 1 ORDER BY DISTANCE_KM;
-- 【方法3】空間インデックスを活用した高速検索(最適化版)
-- バウンディングボックスで事前フィルタリングしてから距離計算
SELECT LOCATION_ID, LOCATION_NAME, LOCATION_TYPE, ADDRESS, LATITUDE, LONGITUDE, POSTAL_CODE, PHONE_NUMBER, DESCRIPTION, DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'KILOMETER' ) AS DISTANCE_KM, ROUND( DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'METER' ), 2 ) AS DISTANCE_METERS FROM GEO_LOCATION_DATA WHERE DB2GSE.ST_INTERSECTS( GEOLOCATION, DB2GSE.ST_BUFFER( DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 1.0, 'KILOMETER' ) ) = 1 AND DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'KILOMETER' ) <= 1.0 ORDER BY DISTANCE_KM;
-- 【おまけ】最も近い施設を5件取得
SELECT LOCATION_ID, LOCATION_NAME, LOCATION_TYPE, ADDRESS, DB2GSE.ST_DISTANCE( GEOLOCATION, DB2GSE.ST_POINT(139.767125, 35.681236, 4326), 'METER' ) AS DISTANCE_METERS FROM GEO_LOCATION_DATA WHERE LOCATION_NAME <> '東京駅' ORDER BY DISTANCE_METERS FETCH FIRST 5 ROWS ONLY;
GEO_LOCATION_DATAテーブルにDB2GSE.ST_POINT型のGEOLOCATIONカラムと空間インデックスを定義し、地理空間検索を実現ST_POINT関数で経度・緯度から地理空間オブジェクトを生成し、東京駅周辺15件の実在施設データを挿入ST_DISTANCE、ST_WITHIN、ST_BUFFERなどDb2地理関数で東京駅から1km以内を検索し距離順にソート
もし、上記の生成されたSQLを実際に実行した際に、「"DB2GSE.ST_POINT" is an undefined name"」のようなSQLエラーが発生した場合、次の例のように"DB2GSE."を削除してみてください(他の"DB2GSE."の箇所も同様)。
修正前
DB2GSE.ST_POINT
修正後
ST_POINT
例1、例2で示されたように、AIアシスタントにシンプルな指示を与えるだけで簡単に複雑なSQLの作成を代行させることができました。
Part#1のまとめ
この回では、Db2 AI AdvancedやDb2 AI Standardエディションで利用できるDb2 Genius Hubを取り上げてみました。
Db2 Genius Hubで利用されるAIスタックは「持ち込み」も可能です。
Genis Hubの主な7つの機能は次の通りです(本記事執筆時において)。
(1)統合Db2管理
(2)エージェント型AIアシスタント
(3)ログ分析
(4)異常検出
(5)深層モニタリングと迅速なトラブルシューティング
(6)スマートなクエリ最適化とパフォーマンスチューニング
(7)高度な自動化とスクリプト
この記事では"(2)エージェント型AIアシスタント"にフォーカスし、Db2初心者、入門者にとってはスキルレベル的に作成が難しいと思われるSQL(例1と例2)をAIアシスタントで作ってみました。
例1:再帰SQLを使う部品表の作成と照会
例2:位置情報を含む表の作成と照会
読者の皆さんはどんな指示をAIアシスタントに与えてみたいですか?
ぜひ、無料評価版(30日間)およびDb2 AI Advanced, Db2 AI Standardエディション付属のDb2 Genius Hubをお試しください。
Db2 AI Advanced, Db2 AI Standardエディション付属のDb2 Genius Hubのご利用にあたっては、「IBM提供のAIスタックを利用する」構成を採用された場合、別途AIトークンが必要ですが、トークンは2027年7月4日(米国日付)まで無料です(変更になる可能性があります)。この日以降は、お客様は追加のトークンパックを購入できます。
無料評価版のDb2 Genius Hubの場合、無料評価期間において利用できるAI機能(AIアシスタントを含む)に週あたりの上限が定められています。
関連情報
IBM Db2 Genius Hub マニュアル
https://www.ibm.com/docs/en/db2-genius-hub/1.1.0
IBM Blog「The Next Horizon for Db2: Redefining Databases with Agentic Intelligence」
https://community.ibm.com/community/user/blogs/krishna-guntuka/2026/03/12/the-next-horizon-for-db2-with-agentic-intelligence
Db2 Genius Hub Webサイト
30日間の無料評価版のダウンロードもこちらから
https://www.ibm.com/jp-ja/products/db2-genius-hub
無料評価版をご希望の場合、画面の"無料評価版 (30日間)"をクリックしてください


