🔄 Cloud Spanner インターリーブ

親子関係のあるテーブルを物理的に近くに配置する機能

📋 インターリーブとは

インターリーブ(Interleave)は、親テーブルと子テーブルのデータを物理的に同じ場所に保存することで、結合クエリのパフォーマンスを劇的に向上させる機能です。

CREATE TABLE Customers ( CustomerId INT64 NOT NULL, Name STRING(100), Email STRING(100), ) PRIMARY KEY (CustomerId); CREATE TABLE Orders ( CustomerId INT64 NOT NULL, OrderId INT64 NOT NULL, OrderDate DATE, TotalAmount FLOAT64, ) PRIMARY KEY (CustomerId, OrderId), INTERLEAVE IN PARENT Customers ON DELETE CASCADE; -- ↑ この行がインターリーブの設定

🔍 データ配置の違い

❌ インターリーブなし

親と子が別々の場所に保存される

Customers テーブル
Customer 1
Customer 2
Customer 3
⬇️ 物理的に離れた場所 ⬇️
Orders テーブル
Order 101 (Customer 1)
Order 102 (Customer 1)
Order 201 (Customer 2)
Order 301 (Customer 3)

✅ インターリーブあり

親と子が物理的に隣接して保存される

Customers + Orders (インターリーブ)
Customer 1
Order 101
Order 102
Customer 2
Order 201
Customer 3
Order 301

⚡ パフォーマンスへの影響

以下のようなクエリで大きな差が出ます:

SELECT c.Name, o.OrderId, o.TotalAmount FROM Customers c JOIN Orders o ON c.CustomerId = o.CustomerId WHERE c.CustomerId = 123;

インターリーブなし

🐌

複数のストレージ領域から
データを読み取る必要がある

ネットワークホップ: 多

インターリーブあり

🚀

1回のストレージアクセスで
親子両方のデータを取得

ネットワークホップ: 最小

✨ インターリーブのメリット

⚠️ 注意点

🎯 使うべきケース

✅ 適している

  • 顧客と注文の関係
  • ブログ記事とコメント
  • アルバムと楽曲
  • 組織と従業員

❌ 適さない

  • 多対多の関係
  • 頻繁に親を変更する必要がある
  • 子レコードが数万件以上
  • 独立してクエリすることが多い