OceanBaseデータベースは現在、プルモードのtable_scanイテレーションプロセスを使用しています。各行をSQL層にイテレーションして出力する際には、以下のいくつかの段階を経ています:
各SSTableはquery rangeに基づいてスキャン対象となるマクロブロックとそれに対応するマイクロブロックを特定し、各マイクロブロックに対してスキャンを開き、必要な行全体を出力します。
MemTable/Minor SSTable/Major SSTableの複数のイテレータは、それぞれ独立して行をイテレーションします。
ベストツリーに基づいて、複数のイテレータの現在の行のrowkeyが同一かどうかによって、fuseに参加する必要がある行数を決定します。
fuse後の最終結果行は、必要に応じて投影され、最終的な結果行が取得されます。
最終的な結果行を使用して、SQLのfilterコールバック関数を呼び出してチェックを行い、条件を満たす場合は上位に返します。
クエリの下押し
LSM-Treeアーキテクチャのストレージエンジンでは、一般的にクエリ処理において以下の問題が発生します:
過多かつ頻繁なイテレーションとプライマリキー比較。特にOLAP業務において、多くのシナリオでテーブルはほとんど更新されず、データは主にベースラインMajor SSTableに格納されています。MemTableおよびMinor SSTableには、増分または更新データがわずかしか存在しません。理想的な状況では、ほとんどのパスでMajor SSTableから直接スキャンできるようにすべきであり、プライマリキーに重複が存在する場合のみ、Major SSTable、MemTable、Minor SSTableのいずれかをfuse対象とします。しかし、現時点の実装では、各行ごとにストレージおよびMemTable内のイテレータと比較してプライマリキーが等しいかどうかを判断する必要があります。これにより、効率が著しく低下し、今後ベクトル化拡張への可能性もほぼ失われています。
フィルターオペレーターの計算時間が遅すぎる。上記の点と組み合わせると、最終的な結果の正確性を保証するため、すべての行がfuseされた後にデータが最新の状態であることを確認する必要があります。そのため、現在のフィルターオペレーターのチェックは、各行のイテレーションの最後に行われています。
不要な投影が多い。マイクロブロックからスキャンして上位に持ち上げられた行は、最終的にユーザーが必要とするすべての列がすでに投影されていることを保証する必要があります。複数回のイテレーションとfuseの後に、フィルター計算で条件を満たすと直接返すことができますが、条件を満たさない場合、フィルターに必要な列以外の他の投影列は無駄になります。
以上の理由から、OceanBaseデータベースはフィルターオペレーターをストレージ層に下押しすることで、上記の問題を解決しています。以下に図を示します:

オペレーターの下押し:OceanBaseデータベースは、データ間で交差がない状態を迅速に区別でき、すなわちmajor SSTableと増分データ間に交差がないデータ範囲を認識できます。この範囲のデータは、major SSTableのみを参照すれば最新の最終状態を取得できるため、このデータに対してフィルターオペレーターを下押しすることができます。
オペレーターによるフィルタリング:各下押しされたfilter式は、ストレージ層が理解できる形式の式木に解析・分割されます。これは対応する列情報とそのフィルタリング条件式を含みます。さらに、フィルタリング条件の複雑さに応じて、ブラックボックスとホワイトボックスの2種類のモードに細分化することも可能です。
SQL層に基づくフィルタリング(ブラックボックス):例えば、a * 2 > 3 のような式計算型のフィルタリング条件は、ストレージ層では処理できず、依然としてSQL層の関数にコールバックして処理する必要があります。この場合、オペレーターはマイクロブロックデコーダー層まで下押しされても、さらに下押しすることはできず、filter node情報に基づいて対応する列を投影した上で、SQL層のコールバック関数を呼び出して結果を計算する必要があります。
ストレージに基づくフィルタリング(ホワイトボックス):例えば、a > 1 または b = 'abc' のような単純で一般的なフィルタリング条件は、ストレージ層が意味を理解し、処理可能なfilter nodeです。SQL層は、対応する演算子およびその定数式をさらに解析し、ストレージ層はこのfilter nodeを各列に対応するデコードルールにさらに下押しすることができます。これにより、投影のオーバーヘッドを省略でき、同時にエンコード情報を利用して高速化が可能になります。