Text
Page: 1
Active Record ADBC adapter
須藤功平
株式会社クリアコード
RailsTokyo#2【sponsored by 株式会社タイミー】
2025-12-18
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 2
私が今日実現したいこと
✓ Railsアプリ開発者の意見を聞きたい
✓ 私はRailsアプリをほとんど書かないから
✓ RailsアプリでDBと高速に大量データを
やりとりできるとうれしいかを知りたい
✓ バッチ処理でうれしいとかでもいい
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 3
背景
✓ Webアプリ以外でもRubyが使われるといいな
✓ たとえばデータ処理とか
✓ Red Data Tools: https://red-data-tools.github.io/ja/
✓ Ruby用のデータ処理ツールを提供するプロジェクト
✓ Railsアプリ開発者向けのやつを
提供するといいかも?
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 4
Railsアプリでのデータの場所
データベースでしょ!
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 5
Active Record ADBC adapter
https://github.com/red-data-tools/activerecord-adbc-adapter
✓ Active RecordでADBCを使えるアダプター
✓ ADBC: Apache Arrowで高速データ交換
DB
✓ ADBCもDB接続を抽象化! アダプター
Active Recordのアダプターと同じ
AR
Active Record ADBC adapter
pgPostgreSQL
ADBCDuckDB
sqlite3SQLite
Powered by Rabbit 4.0.2
Page: 6
ロード
✓ DB: PostgreSQL
✓ 数値カラム100個
✓ 1万行
✓ 低いほど速い
✓ 生SQLよりも約5倍速い
INSERT INTO VALUES
✓ PGアダプターより約40倍速い
insert_all
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 7
ダンプ
✓ DB: PostgreSQL
✓ 数値カラム100個
✓ 1万行
✓ 低いほど速い
✓ 生SQLよりも約2倍速い
SELECT *
✓ PGアダプターより約5倍速い
pluck
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 8
なぜ速いのか?
変換が少ない・最適化されている
PostgreSQLならCOPYを使うとか
手法
INSERT
ADBC
insert_all
Active Record ADBC adapter
変換
少ない
少ない
多い
👍
👍
最適化
なし
あり
なし
👍
Powered by Rabbit 4.0.2
Page: 9
生SQLで最適化すればいいんじゃない?
✓ 各自ががんばる?
✓ みんなで一緒にがんばって共有しない?
✓ Apache Arrowが目指している世界観
✓ ADBCでも同じ
✓ 言語を超えて共有したい
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 10
使い方
✓ 標準の複数データベース対応機能を使う
✓ メインのDB設定とは別にADBC用設定を用意
✓ ADBCは大量データ用
✓ レコード単位での操作は既存アダプターの方がよい
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 11
複数データベース対応機能:設定
production:
primary:
adapter: postgresql
...
adbc:
adapter: adbc
driver: adbc_driver_postgresql
...
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 12
複数データベース対応機能:モデル
# app/models/adbc_application_record.rb
class AdbcApplicationRecord < ActiveRecord::Base
include ActiveRecordADBCAdapter::Ingest # 高速ロード用
self.abstract_class = true
# :adbcは設定ファイル内のキーと合わせる
connects_to database: { writing: :adbc, reading: :adbc }
end
# app/models/adbc_event.rb
class AdbcEvent < AdbcApplicationRecord
# クラス名にAdbcをつけたのでテーブル名を指定
self.table_name = :events
end
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 13
使い分ける
# レコード単位での操作は通常のモデルを使う
Event.find(id)
# 大量データを扱うときはAdbcXXXモデルを使う
AdbcEvent.all.to_arrow
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 14
私が今日実現したいこと
✓ Railsアプリ開発者の意見を聞きたい
✓ 私はRailsアプリをほとんど書かないから
✓ RailsアプリでDBと高速に大量データを
やりとりできるとうれしいかを知りたい
✓ バッチ処理でうれしいとかでもいい
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 15
高速な大量データ以外のメリット
✓ ADBC対応DBに接続できる
https://arrow.apache.org/adbc/current/driver/status.html
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 16
ARでつなぎにくそうなADBC対応DB
✓ DuckDB
✓ 「DuckDB実践入門」がこの間出版されたよ!
https://darashi.net/2025/09/19/duckdb-in-action-ja/
✓ Google BigQuery
✓ Snowflake
これらはデータ分析用DB
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 17
Active Recordで分析用DBにアクセス
✓ うれしい。。。の?
✓ ARのAPIは分析用SQL向けじゃない
✓ 1レコードを1オブジェクトで扱うAPIだから当然
✓ 分析用SQL:window関数とか
✓ ちょっとやってみたけど不便。。。
✓ 私のActive Record力不足?
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 18
事例
ADBC経由でDuckDBをRailsアプリに組み込んだよ!
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 19
私が今日実現したいこと
✓ Railsアプリ開発者の意見を聞きたい
✓ 私はRailsアプリをほとんど書かないから
✓ RailsアプリでDBと高速に大量データを
やりとりできるとうれしいかを知りたい
✓ バッチ処理でうれしいとかでもいい
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 20
お誘い
✓ Red Data Tools: https://red-data-tools.github.io/ja/
✓ Ruby用のデータ処理ツールを提供するプロジェクト
✓ 一緒に開発したい人はチャットに来てね
✓ https://app.element.io/#/room/#red-data-tools-ja:matrix.org
✓ 毎週水曜日の12:15-12:45にライブ開発
したりもしているよ
✓ Red Data Tools開発者に聞け!
https://www.youtube.com/playlist?
list=PLKb0MEIU7gvQOIACKgdgKuAE7cMPDuTE6
Active Record ADBC adapter
Powered by Rabbit 4.0.2
Page: 21
お願い
✓ そろそろRuby 4.0.0リリースだよ
✓ 今のうちに触ってみて
✓ 問題があったら報告して
✓ リリースまでに直せるかも
✓ csv/strscan/stringio/rexml/rdoc/rubygems
あたりは私も見てるよ
✓ 口頭で相談でもいいよ
Active Record ADBC adapter
Powered by Rabbit 4.0.2