大規模な分析ワークロードでは、クエリにはしばしば**繰り返されるフィルタリング条件(Conditions)**が含まれます。例えば:
SELECT * FROM orders WHERE region = 'ASIA'; SELECT count(*) FROM orders WHERE region = 'ASIA';
このようなクエリは、同一のデータセグメントに対して同じフィルタリングロジックを繰り返し実行するため、冗長なCPUとI/Oオーバーヘッドを引き起こします。
これに対処するため、Apache DorisはCondition Cacheメカニズムを導入しています。 これは、特定の条件による指定されたセグメントでのフィルタリング結果をキャッシュし、後続のクエリがそれらの結果を直接再利用できるようにすることで、不要なスキャンとフィルタリング操作を削減し、クエリレイテンシを大幅に低減します。
Condition Cacheの中核概念は以下の通りです:
キャッシュされた結果は、圧縮された**ビットベクトル(std::vector<bool>)**として格納されます:
このメカニズムにより、Dorisは粗い粒度で無関係なデータブロックを迅速に除去し、必要な場合にのみ細かい粒度のフィルタリングを実行できます。
Condition Cacheは以下の場合に最も効果的です:
Condition Cacheは以下の状況では使用されません:
SET enable_condition_cache = true;
condition_cache_limitを超過した場合、最も使用頻度の低いエントリが自動的にクリアされます。be.confでメモリ制限を変更できます:
condition_cache_limit = 1024 # Unit: MB
Doris は Condition Cache の効果をユーザーが監視するための包括的なメトリクスを提供しています:
ConditionCacheSegmentHit: キャッシュにヒットしたセグメント数ConditionCacheFilteredRows: キャッシュされた結果により直接スキップされた行数/metrics で表示可能)condition_cache_search_count: キャッシュルックアップの総数condition_cache_hit_count: キャッシュヒットの成功数これらのメトリクスはキャッシュの効果とヒット率の評価に役立ちます。
次のクエリを考えてみます:
SELECT order_id, amount FROM orders WHERE region = 'ASIA' AND order_date >= '2023-01-01';
複数のクエリが同じフィルタ条件を共有する場合(例:region = 'ASIA' AND order_date >= '2023-01-01')、お互いのCondition Cacheエントリを再利用でき、全体的なワークロードを削減します。
Condition CacheはDorisにおける反復的な条件クエリ向けに設計された最適化メカニズムです。その利点は以下の通りです:
Condition Cacheを効果的に活用することで、ユーザーは高頻度なOLAPクエリシナリオにおいて大幅に高速な応答時間を実現できます。