PostgreSQL・DuckDB・SQLiteでは代替できない5つのleakage-free特徴量エンジン。PJ33艇脳・PJ38馬脳の実装コードとOpus調査結果から解剖する。
Opusの分析と実コードの調査から導いた本質的答え。
PostgreSQL・DuckDBとの具体的差分。コードは全てPJ33/PJ38の実装から引用。
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING で「当該行を絶対に含まない」時系列rolling統計が宣言的に書ける。PARTITION BY × ORDER BY × RANGE で任意の時系列集計が1クエリで完結。
-- 「最新レースから始まる連続逃げ先行ストリーク本数」を1クエリで抽出 WITH ordered_races AS ( SELECT s.KETTO_TOROKU_BANGO, r.RACE_DATE, s.CORNER1, s.FIELD_SIZE, ROW_NUMBER() OVER (PARTITION BY s.KETTO_TOROKU_BANGO ORDER BY r.RACE_DATE DESC) AS rn FROM JRDB_SED s JOIN RACES r ON r.RACE_ID = s.JRDB_RACE_KEY WHERE r.RACE_DATE < TO_DATE(:cutoff_date, 'YYYY-MM-DD') ), front_streaks AS ( SELECT * FROM ordered_races MATCH_RECOGNIZE ( -- ← PostgreSQL未実装 PARTITION BY KETTO_TOROKU_BANGO ORDER BY rn MEASURES COUNT(*) AS streak_len, FIRST(rn) AS first_rn ONE ROW PER MATCH AFTER MATCH SKIP PAST LAST ROW PATTERN (FRONT+) DEFINE FRONT AS CORNER1 <= 3 -- 1〜3番手通過 = 逃げ/先行 ) ) SELECT KETTO_TOROKU_BANGO, CASE WHEN first_rn = 1 THEN streak_len ELSE 0 END AS consec_front_runs FROM front_streaks WHERE match_num = 1
「代替可能」と「代替困難」を明確に分離する。
| 機能 | Oracle 23ai | PostgreSQL | DuckDB | ML精度への影響 |
|---|---|---|---|---|
| Property Graph (SQL/PGQ) | ✅ ネイティブ | Apache AGE拡張(非標準) | ❌ 不可 | h2h_pagerank / racer_venue相性が Top-1〜5 特徴量 |
| VECTOR型 + HNSW | ✅ ネイティブ | pgvector拡張 (ACID境界外) | ❌ 不可 | 類似レース文脈KNN特徴量 / 36次元HNSW本番稼働 |
| MATCH_RECOGNIZE | ✅ SQL標準実装 | ❌ 未実装(提案中) | ❌ 不可 | consec_front_runs 等の状態遷移特徴量(V32) |
| KEEP (DENSE_RANK LAST) | ✅ Oracle固有 | DISTINCT ON (冗長) | ROW_NUMBER サブクエリ必要 | 直前追い切り指数の推論直前再計算(V28) |
| Materialized View + DBMS_MVIEW | ✅ オンデマンド制御 | REFRESH CONCURRENTLYで代替可 | ❌ 不可 | player_motor_affinity MVIEW / WF-CV高速化(数時間→数分) |
| Window Functions (PARTITION/ORDER/ROWS) | ✅ ANSI標準 | ✅ 代替可 | ✅ 代替可(高速) | trainer_win_rate 等 rolling統計(代替可能だがOracle並列実行が高速) |
| MERGE INTO (冪等UPSERT) | ✅ ANSI標準 | INSERT...ON CONFLICT で代替可 | INSERT OR REPLACE で代替可 | ETL信頼性。PJ33/PJ38合計 26箇所以上で使用 |
| FLASHBACK / AS OF SCN | ✅ Oracle固有 | ❌ 不可 | ❌ 不可 | 「過去任意時点の特徴量」再現でfeature/serving skew撲滅 |
抽象論ではなく、実際のコードと精度数値で検証する。
| 追加したOracle機能 | PJ | 特徴量 | 精度変化 |
|---|---|---|---|
| Property Graph 2-hop (v6) | 🚤 PJ33 | h2h_win_rate_min / field_motor_strength_mean | 回収率 +4.2pp → 160.7% |
| VECTOR(36) + HNSW ANN (v9) | 🚤 PJ33 | knn_avg_payout / upset_rate / payout_std | ROI 200%超ラインを突破 |
| H2H時系列 ADD_MONTHS 10年 (v10) | 🚤 PJ33 | h2h_temporal_score (#2, gain 16.76%) | True OOS ROI 199.8% |
| JRDB 305K行 JOIN (V3) | 🐎 PJ38 | chokyo_idx / kyusha_idx (+11列) | 調教指数が常時Top-3入り |
| H2H Graph 246万行 (V5) | 🐎 PJ38 | h2h_win_rate (全特徴量中 Top-1) | V5以降の全モデルで安定Top-1 |
| kijun_times MEDIAN/STDDEV 126条件 (V11) | 🐎 PJ38 | horse_avg_pace_dev (Top-11/12) | turf EV回収率 +4.9pp |
| MATCH_RECOGNIZE FSM (V32-A) | 🐎 PJ38 | consec_front_runs / front_runner_rate | V32 評価中 |
| KEEP (DENSE_RANK LAST) (V28) | 🐎 PJ38 | cha_last_oikiri_idx(直前追い切り) | 推論直前再計算コスト ↓ |
「時系列厳守 × 関係性 × 類似性 × 状態遷移が全て効く」ドメインならどこでも成立する。
Free版 12GB制限 → Enterprise 無制限移行で今まで諦めていた機能が全て有効化される。