何が発表されたのか
マイクロソフトリサーチ(MSR)の元研究員であるデビッド・ロメ(David B. Lomet)氏は、ホストのフィル・バーンスタイン(Phil Bernstein)氏が主催する「DB Lunch」セッションにおいて、データベースのインデックスアクセスにおけるスケーラビリティを劇的に向上させる新技術「ノーティス(Notices)」を発表しました。
この発表は、データベースエンジンにおけるマルチコアスケーラビリティの限界を突破するための、研究段階の新しいアーキテクチャ提案です。マイクロソフトが過去に開発したラッチフリーインデックス木「Bw-tree」の設計思想を継承しつつ、その最大のボトルネックであった「ノード統合(Consolidation)時の重複処理」を完全に排除する技術として位置づけられます。
発表された機能・アップデートの全容
1. ラッチフリーインデックスにおける「無駄な作業(Wasted Work)」の課題
マルチコアプロセッサの性能を極限まで引き出すため、データベース業界ではラッチ(排他制御)を使用しない「ラッチフリー」技術の研究が進められてきました。従来のBw-treeでは、Compare-and-Swap(CAS)命令を用いて、ノードの変更履歴を「デルタレコード」としてチェイン状に連結していくアプローチが取られていました。
しかし、このデルタレコードが長くなると、インデックスの検索(読込)性能が著しく低下します。そのため、定期的にデルタレコードを集約し、新しいクリーンなベースページを構築する「統合(Consolidation)」処理が必要となります。ロメ氏の説明によると、従来の設計では、複数のスレッドが競合して独立してこの重い統合処理を実行し、最後にCAS命令でマッピングテーブルの書き換えを競合させていました。この結果、CASに敗北したスレッドが費やした計算リソースはすべて無駄になり、高負荷環境におけるスケーラビリティを著しく阻害していました。
2. 新技術「ノーティス(Notices)」による競合の早期解決
この無駄な重複作業を解決するために提案されたのが「ノーティス(Notices)」です。ノーティスとは、新しいページをインストールする「権利」をスレッド間で事前に競合・合意するための軽量なシグナルです。
従来のように重いページ統合処理を完了させてから最後にCASで競合させるのではなく、統合処理を開始する前の段階で、マッピングテーブルに対して「私がこれから統合処理を行います」という意思表示(Notice)をCASによって登録します。このCASに成功した唯一の勝者スレッドだけが実際の統合処理を実行し、敗者となった他のスレッドは、無駄な統合処理を即座に中止して通常のデータ更新処理に戻ることができます。これにより、システム全体でのCPUサイクルの浪費を防ぎます。
3. ノーティスを用いた協調的なノード統合(Consolidation)プロセス
ノーティスを導入した環境における、ノード統合プロセスの具体的な挙動がスライドを用いて解説されました。勝者となったスレッド(スライド内のThread 1)がマップテーブルに「Notice 1」を登録すると、このノードに対するバリアが形成されます。
統合処理の実行中であっても、データベースへの書き込み要求は止まりません。敗者となった他のスレッド(Thread 2など)は、統合処理を重複して行う代わりに、進行中の新規更新(Ongoing Updates)を、登録された「Notice 1」の上部にデルタレコードとして追加していきます。勝者スレッドは、バックグラウンドで静かに古いベースノードとそれまでのデルタを統合した「新ベースノード」を構築します。構築完了後、マッピングテーブルのポインタを切り替える際、統合処理中に他のスレッドが追加した新規デルタレコードを新しいベースノードの上部にそのまま引き継ぎます。この協調的なパイプライン処理により、スレッドのストールやコンテキストスイッチを完全に回避します。
4. 複数ノードにまたがる構造変更操作(SMO)へのノーティス適用
データベースのインデックス木では、データの挿入や削除に伴い、ページの分割(Split)やマージ(Merge/Delete)といった「構造変更操作(SMO: Structure Modification Operations)」が発生します。これは単一のノードにとどまらず、複数のノードや親ノードの書き換えを伴う複雑な処理です。
ロメ氏は、ノーティス技術をこのSMOにも拡張できることを示しました。ページ分割においては「分割ノーティス(sNotice)」を導入し、古いページと新しく生成されたページ間の境界を保護します。マージ処理においては、親ノード用の「PNotice」、削除対象ノード用の「DNotice」、マージ先ノード用の「MNotice」という3種類のノーティスを協調して動作させます。これにより、複雑な複数ノードの書き換えプロセス全体をラッチフリーかつストールフリーで実行可能にし、SMO実行中であっても、他の更新スレッドが影響を受けることなく処理を継続できる環境を実現しました。
5. エポックベースのメモリ管理とFetch-and-Incrementによる最適化
ラッチフリーシステムにおける大きな技術的課題の1つが、不要になった古いメモリの安全な解放タイミングの制御です。ロメ氏は、このメモリ管理に「エポック(Epoch)」ベースの管理手法を適用していることを説明しました。
エポックは、どのスレッドからも参照されなくなった古いページ状態を安全に特定し、一括してメモリを解放するための世代管理システムです。また、ログ構造化ストレージへの書き込みバッファ管理においては、CASよりも高速に動作する「Fetch-and-Increment」アトミック命令を活用し、複数のスレッドが競合することなくバッファ内の書き込みスロットを確保できる仕組みを導入しています。これらのシステムレベルの最適化により、インデックスアクセスだけでなく、ストレージ書き込み経路全体におけるロックフリー化を達成しています。




