This is an automated email from the ASF dual-hosted git repository.

HappenLee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 511b6e27168 [doc](query-cache) Document incremental merge 
(experimental) (#3975)
511b6e27168 is described below

commit 511b6e271688fa05298a4b0f3f8d286386965501
Author: Benedict Jin <[email protected]>
AuthorDate: Wed Jul 15 22:09:27 2026 +0800

    [doc](query-cache) Document incremental merge (experimental) (#3975)
    
    Documents the experimental **incremental merge** feature of the query
    cache
    in the dev docs, English and Chinese. The feature itself is proposed in
    a
    companion PR in apache/doris, which links back to this document PR:
    
    - A new "Incremental Merge (Experimental)" section: motivation (hourly
    loads
    keep invalidating the hot partition's entries), how a stale entry is
    reused
    by scanning only `(cached_version, current_version]`, the prerequisites
    (append-only index: DUP_KEYS, or merge-on-write UNIQUE_KEYS whose delta
    window did not rewrite pre-existing keys; non-finalize aggregation
    directly
      above the scan; local storage mode; capturable delta with no delete
      predicates), entry compaction via
      `query_cache_max_incremental_merge_count`, and observability (profile
      fields and BE metrics).
    - One row in each configuration table for
      `enable_query_cache_incremental` and
    `query_cache_max_incremental_merge_count`, plus a cross reference from
    the
      invalidation table.
    - Five self-contained SVG diagrams (fonts embedded, consistent
    rendering)
    under `static/images/next/query-cache/`, one per subsection: comparison,
    merge-on-write delete bitmap window, per-instance dataflow, decision
    flow
      with all fallback reasons, and the overall architecture.
    
    The feature ships default-off behind the experimental session switch;
    the
    docs mark it as experimental accordingly.
---
 docs/query-acceleration/query-cache.md             |  52 ++++++++-
 .../current/query-acceleration/query-cache.md      |  52 ++++++++-
 .../query-cache/incremental-merge-architecture.svg | 125 +++++++++++++++++++++
 .../query-cache/incremental-merge-dataflow.svg     |  82 ++++++++++++++
 .../incremental-merge-decision-flow.svg            |  98 ++++++++++++++++
 .../query-cache/incremental-merge-mow-bitmap.svg   |  71 ++++++++++++
 .../query-cache/incremental-merge-overview.svg     |  99 ++++++++++++++++
 7 files changed, 577 insertions(+), 2 deletions(-)

diff --git a/docs/query-acceleration/query-cache.md 
b/docs/query-acceleration/query-cache.md
index 4711f89b609..b1b2563ec2c 100644
--- a/docs/query-acceleration/query-cache.md
+++ b/docs/query-acceleration/query-cache.md
@@ -84,7 +84,7 @@ Intermediate nodes such as `FilterNode` and `ProjectNode` are 
allowed between th
 
 | Trigger Condition  | Description                                             
                                                                                
   |
 | ------------------ | 
------------------------------------------------------------------------------------------------------------------------------------------
 |
-| Data change        | INSERT, DELETE, UPDATE, or compaction increments the 
tablet version number; subsequent queries compare versions, and a mismatch is a 
miss. |
+| Data change        | INSERT, DELETE, UPDATE, or compaction increments the 
tablet version number; subsequent queries compare versions, and a mismatch is a 
miss. With [incremental merge](#incremental-merge-experimental) enabled, an 
entry with an older version may instead be reused by scanning only the delta. |
 | Schema change      | ALTER TABLE changes the table structure, which changes 
the execution plan and the digest.                                              
    |
 | LRU eviction       | When cache memory exceeds the limit, entries are 
evicted according to LRU-K (K=2); a new entry must be accessed at least twice 
to be admitted. |
 | Expiration cleanup | Entries older than 24 hours are automatically removed 
by a periodic cleanup task.                                                     
     |
@@ -179,6 +179,54 @@ The Query Cache relies on three properties unique to 
internal OLAP tables:
 
 For caching needs on external tables, use [SQL Cache](./sql-cache-manual.md) 
instead.
 
+## Incremental Merge (Experimental)
+
+<!-- Knowledge type: principle + operation -->
+<!-- Applicable scenario: hourly batch loads into a hot partition keep 
invalidating its cache entry -->
+
+By default, a cache entry whose version falls behind (for example, the current 
partition of a table that receives hourly loads) is discarded, and the whole 
instance is recomputed from a full scan. With **incremental merge** enabled, BE 
reuses the stale entry instead: it scans only the delta rowsets in 
`(cached_version, current_version]`, emits their partial aggregation state 
**together with** the cached partial blocks (the upstream merge aggregation 
combines both), and writes the merged  [...]
+
+![Full recompute vs incremental 
merge](/images/next/query-cache/incremental-merge-architecture.svg)
+
+```sql
+SET enable_query_cache = true;
+SET enable_query_cache_incremental = true;  -- shown as 
experimental_enable_query_cache_incremental in SHOW VARIABLES
+```
+
+### Prerequisites
+
+Incremental merge only takes effect when **all** of the following hold; in 
every other case the query silently falls back to a full recompute, so results 
are always correct:
+
+1. The scanned index (base table or the selected rollup) is **append-only**: 
either the **DUP_KEYS** model, or a **merge-on-write UNIQUE_KEYS** table whose 
delta window did not rewrite any pre-existing key. For merge-on-write tables BE 
checks the delete bitmap of `(cached_version, current_version]` per tablet: a 
window that only appended brand-new keys (the common "hourly load" pattern on a 
primary-key table) is merged incrementally, while an upsert, a partial update 
or a delete sign tha [...]
+2. The cache point is a **non-finalize aggregation directly above the scan** 
(the common two-phase aggregation shape, e.g. `GROUP BY` on a non-distribution 
column). One-phase aggregations and nested aggregation cache points are 
rejected.
+3. The cluster runs in the **shared-nothing (local storage)** mode.
+4. The delta version path is still capturable (not merged away by compaction) 
and contains **no DELETE predicate**, because a delete inside the delta 
logically removes rows that are already folded into the cached blocks, which 
cannot be undone by merging.
+
+For merge-on-write tables, the delete bitmap window check works as follows:
+
+![Merge-on-write delete bitmap window 
check](/images/next/query-cache/incremental-merge-mow-bitmap.svg)
+
+### Compaction of Merged Entries
+
+Every incremental merge appends the delta blocks to the entry, so the entry 
gets more fragmented over time. When an entry has accumulated 
`query_cache_max_incremental_merge_count` merges (BE configuration, default 
`8`, changeable at runtime), the next query recomputes it from a full scan, 
which naturally compacts the entry.
+
+The dataflow inside one instance, including the write-back and both entropy 
controls:
+
+![Incremental execution dataflow inside one 
instance](/images/next/query-cache/incremental-merge-dataflow.svg)
+
+### Observability
+
+- In the query profile of the CACHE_SOURCE operator: `HitCacheStale = 1` 
indicates an incremental merge; `IncrementalDeltaVersions` shows the delta 
range (for example `(100, 114514]`); when a stale entry could not be reused, 
`IncrementalFallbackReason` explains why (`delta versions not capturable`, 
`delta contains delete predicates`, `delta rewrites history rows`, `keys type 
not append-only`, and so on).
+- BE metrics: `doris_be_query_cache_stale_hit_total`, 
`doris_be_query_cache_incremental_fallback_total`, and 
`doris_be_query_cache_write_back_total`.
+
+How BE decides between HIT, INCREMENTAL and MISS, and where each fallback 
reason comes from:
+
+![Decision flow and the eight fallback 
reasons](/images/next/query-cache/incremental-merge-decision-flow.svg)
+
+Putting it all together, from the FE authorization to the storage-level guards:
+
+![Incremental merge overview across FE, BE and 
storage](/images/next/query-cache/incremental-merge-overview.svg)
+
 ## Configuration Parameters
 
 <!-- Knowledge type: parameter reference -->
@@ -192,12 +240,14 @@ For caching needs on external tables, use [SQL 
Cache](./sql-cache-manual.md) ins
 | `query_cache_force_refresh`   | When set to `true`, the cached result is 
ignored and the query is re-executed; the new result is still written to the 
cache. | `false`            |
 | `query_cache_entry_max_bytes` | The maximum size in bytes of a single cache 
entry; fragment results that exceed this limit are not cached. | `5242880` (5 
MB)   |
 | `query_cache_entry_max_rows`  | The maximum number of rows of a single cache 
entry; fragment results that exceed this limit are not cached. | `500000`       
    |
+| `enable_query_cache_incremental` | (Experimental) Allows BE to reuse a stale 
cache entry by scanning only the delta rowsets since the cached version and 
merging them with the cached partial aggregation blocks. See [Incremental 
Merge](#incremental-merge-experimental). | `false` |
 
 ### BE Configuration (be.conf)
 
 | Parameter          | Description                                             
 | Default |
 | ------------------ | 
-------------------------------------------------------- | ------- |
 | `query_cache_size` | The total memory capacity of the Query Cache on each BE 
(MB). | `512`   |
+| `query_cache_max_incremental_merge_count` | The maximum number of 
incremental merges accumulated on one cache entry before a full recompute is 
forced to compact it. `0` disables incremental merge at runtime. | `8` |
 
 :::note
 The `query_cache_max_size_mb` and `query_cache_elasticity_size_mb` settings in 
`be.conf` control the legacy SQL Result Cache. They are **not** the 
pipeline-level Query Cache described in this article. Do not confuse them.
diff --git 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/query-cache.md
 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/query-cache.md
index 92c021c1ff6..9b9355202f9 100644
--- 
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/query-cache.md
+++ 
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/query-cache.md
@@ -84,7 +84,7 @@ SELECT region, SUM(revenue) FROM orders WHERE dt = 
'2024-01-01' GROUP BY region;
 
 | 触发条件     | 说明                                                                
                                  |
 | ------------ | 
-----------------------------------------------------------------------------------------------------
 |
-| 数据变更     | INSERT、DELETE、UPDATE 或 Compaction 使 Tablet 版本号递增;后续查询比对版本,不一致即未命中 
          |
+| 数据变更     | INSERT、DELETE、UPDATE 或 Compaction 使 Tablet 
版本号递增;后续查询比对版本,不一致即未命中。开启[增量合并](#增量合并实验性)后,版本落后的条目可改为只扫增量而被复用 |
 | Schema 变更  | ALTER TABLE 改变表结构,从而改变执行计划与摘要                                   
                     |
 | LRU 淘汰     | 缓存内存超限时,按 LRU-K(K=2)淘汰;新条目须至少被访问两次才能被准入                         
        |
 | 过期清理     | 超过 24 小时的条目由周期性清理任务自动移除                                           
                 |
@@ -179,6 +179,54 @@ Query Cache 依赖内部 OLAP 表的三个特有属性:
 
 外部表的缓存需求请改用 [SQL Cache](./sql-cache-manual.md)。
 
+## 增量合并(实验性)
+
+<!-- 知识类型:原理 + 操作 -->
+<!-- 适用场景:小时级批量导入不断写入热分区,导致其缓存条目反复失效 -->
+
+默认情况下,版本落后的缓存条目(例如按小时导入的表的当前分区)会被直接作废,对应的 Pipeline 实例回到全量扫描重算。开启**增量合并**后,BE 
会复用这条过期条目:只扫描 `(缓存版本, 当前版本]` 区间的增量 
rowset,把增量的聚合中间状态与缓存的中间状态**并排**交给上游合并聚合(两者本就是同构的可合并输入),并以新版本回写合并后的条目。对小时级导入场景,热分区的扫描成本从“每小时扫整个分区”降为“只扫最近一小时的新数据”。
+
+![全量重算与增量合并对比](/images/next/query-cache/incremental-merge-architecture.svg)
+
+```sql
+SET enable_query_cache = true;
+SET enable_query_cache_incremental = true;  -- SHOW VARIABLES 中显示为 
experimental_enable_query_cache_incremental
+```
+
+### 生效前提
+
+增量合并仅在**同时**满足以下条件时生效;任一不满足都会静默回退为全量重算,查询结果始终正确:
+
+1. 被扫描的索引(基表或选中的 rollup)为**追加写**模型:**DUP_KEYS** 
表,或增量窗口内未改写既有主键的**写时合并(merge-on-write)UNIQUE_KEYS** 表。对写时合并表,BE 会按 tablet 检查 
`(cached_version, current_version]` 窗口内的 delete 
bitmap:窗口内只新增了全新主键(主键表上常见的“每小时追加导入”模式)即可增量合并;一旦有 upsert、部分列更新或 delete sign 
命中了更早的主键,则回退一次全量重算,重算会以新版本重建条目,下一次纯追加导入即恢复增量。读时合并(merge-on-read)UNIQUE 表在读取时跨 
rowset 归并去重、AGG 表在存储层合并行,“缓存快照 + 增量 = 新快照”不成立;聚合物化视图同理被拒绝。
+2. 缓存点是**直接位于扫描之上、且不做 finalize 的聚合**(常见的两阶段聚合形态,例如按非分桶列 `GROUP 
BY`)。单阶段聚合与嵌套聚合缓存点会被拒绝。
+3. 集群为**存算一体(本地存储)**部署。
+4. 增量版本路径仍可捕获(未被 compaction 合并跨界),且增量中**不含 DELETE 
谓词**(增量中的删除会逻辑上移除已折入缓存块的行,无法通过合并撤销)。
+
+写时合并表的 delete bitmap 窗口检查方式如下:
+
+![写时合并表的 delete bitmap 
窗口检查](/images/next/query-cache/incremental-merge-mow-bitmap.svg)
+
+### 增量部分的合并
+
+每次增量合并都会把增量块追加进条目,条目随之逐渐碎片化。当条目累计 `query_cache_max_incremental_merge_count` 
次合并(BE 配置,默认 `8`,运行时可调)后,下一次查询会强制全量重算,条目自然压实。
+
+单个实例内的增量执行数据流(含回写与两道熵控制):
+
+![单实例内的增量执行数据流](/images/next/query-cache/incremental-merge-dataflow.svg)
+
+### 可观测性
+
+- CACHE_SOURCE 算子的查询 profile:`HitCacheStale = 1` 
表示走了增量合并;`IncrementalDeltaVersions` 展示增量区间(如 `(100, 
114514]`);过期条目未能复用时,`IncrementalFallbackReason` 给出原因(`delta versions not 
capturable`、`delta contains delete predicates`、`delta rewrites history 
rows`、`keys type not append-only` 等)。
+- BE 
指标:`doris_be_query_cache_stale_hit_total`、`doris_be_query_cache_incremental_fallback_total`、`doris_be_query_cache_write_back_total`。
+
+BE 如何在 HIT、INCREMENTAL、MISS 三态间决策,以及每种回退原因的来源:
+
+![决策流程与八种回退原因](/images/next/query-cache/incremental-merge-decision-flow.svg)
+
+从 FE 授权到存储层防线的全景视图:
+
+![增量合并全景:FE、BE 与存储层](/images/next/query-cache/incremental-merge-overview.svg)
+
 ## 配置参数
 
 <!-- 知识类型:参数参考 -->
@@ -192,12 +240,14 @@ Query Cache 依赖内部 OLAP 表的三个特有属性:
 | `query_cache_force_refresh`   | 设为 `true` 时忽略缓存结果并重新执行查询;新结果仍会写入缓存           
                    | `false`             |
 | `query_cache_entry_max_bytes` | 单个缓存条目的最大字节数;超过该限制的 Fragment 结果不会被缓存         
                    | `5242880`(5 MB)   |
 | `query_cache_entry_max_rows`  | 单个缓存条目的最大行数;超过该限制的 Fragment 结果不会被缓存          
                     | `500000`            |
+| `enable_query_cache_incremental` | (实验性)允许 BE 以增量合并方式复用过期缓存条目:只扫描缓存版本之后的增量 
rowset,并与缓存的聚合中间结果一起交给上游合并。详见[增量合并](#增量合并实验性) | `false` |
 
 ### BE 配置(be.conf)
 
 | 参数               | 说明                                       | 默认值 |
 | ------------------ | ------------------------------------------ | ------ |
 | `query_cache_size` | 每个 BE 上 Query Cache 的总内存容量(MB)  | `512`  |
+| `query_cache_max_incremental_merge_count` | 
单个缓存条目上累计增量合并的最大次数,达到后强制一次全量重算以压实条目;设为 `0` 可在运行时禁用增量合并 | `8` |
 
 :::note
 `be.conf` 中的 `query_cache_max_size_mb` 和 `query_cache_elasticity_size_mb` 
控制的是旧版 SQL Result Cache,**不是** 本文描述的流水线级别 Query Cache,请勿混淆。
diff --git a/static/images/next/query-cache/incremental-merge-architecture.svg 
b/static/images/next/query-cache/incremental-merge-architecture.svg
new file mode 100644
index 00000000000..6e7849ef5d5
--- /dev/null
+++ b/static/images/next/query-cache/incremental-merge-architecture.svg
@@ -0,0 +1,125 @@
+<svg viewBox="0 0 1680 1050" xmlns="http://www.w3.org/2000/svg"; role="img" 
font-family="'Comic Neue',cursive">
+  <title>Query Cache Incremental Merge</title>
+  <desc>Comparison diagram. Left: default behavior discards the stale cache 
entry and rescans the whole partition every hour. Right: incremental merge 
reuses the stale entry, scans only one hour of delta rowsets, sends cached 
partial blocks and delta partial blocks side by side to the upstream merge 
aggregate, and writes the combined blocks back as the v101 entry.</desc>
+
+  <defs>
+    <style>@font-face{font-family:'Comic Neue';font-weight:100 
900;src:url(data:font/woff2;base64,d09GMgABAAAAACvcABEAAAAAWtgAACt/AAIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbjC4cIAZgADQISgmcFREICv1Q6xIBNgIkA4MAC4FCAAQgBYMkByAMgTIbrk8l45iFxwHE1DMh+P/PyckYwl6A6nzvtWyOTAOqZAimmUW5YDcN63xvOwc/EOY+MLs2i8USPQpSj2t7fv67zbacyip1RdYPubC9kUWJIIrIkKBCFpmCkWI+mMZy8U4v6qN/e2EgUA/0MppmEGy9eGFadPJ8cTiDUnUxQpLZn/+29eece+/MMMAwFmAsDqXNYmNjja66yEZFva+o+o9If7Kr77UGjepqstAaLIarX/8AZBcEgRReLEUmSpZs7v55iRW1KrpDdSMJwm
 [...]
+    <!-- hand-drawn hatch texture (like the BE boxes on the official diagrams) 
-->
+    <pattern id="hatch" width="14" height="14" patternTransform="rotate(45)" 
patternUnits="userSpaceOnUse">
+      <line x1="0" y1="0" x2="0" y2="14" stroke="#c9c6bf" stroke-width="3"/>
+    </pattern>
+    <!-- dotted texture (like the Shared Storage box) -->
+    <pattern id="dots" width="16" height="16" patternUnits="userSpaceOnUse">
+      <circle cx="4" cy="4" r="1.7" fill="#b9b5ac"/>
+      <circle cx="12" cy="12" r="1.7" fill="#b9b5ac"/>
+    </pattern>
+    <!-- green scribble fill for the reused entry -->
+    <pattern id="greenwash" width="12" height="12" 
patternTransform="rotate(-38)" patternUnits="userSpaceOnUse">
+      <rect width="12" height="12" fill="#eaf6f2"/>
+      <line x1="0" y1="2" x2="12" y2="2" stroke="#bfe4d9" stroke-width="2.6"/>
+      <line x1="0" y1="8" x2="12" y2="8" stroke="#d4ede5" stroke-width="2"/>
+    </pattern>
+  </defs>
+
+  <!-- paper -->
+  <rect x="0" y="0" width="1680" height="1050" fill="#f8f7f3"/>
+
+  <!-- titles -->
+  <text x="400" y="66" text-anchor="middle" font-size="40" font-weight="700" 
fill="#1c1c1c">Full Recompute (default)</text>
+  <text x="1268" y="66" text-anchor="middle" font-size="40" font-weight="700" 
fill="#1c1c1c">Incremental Merge (experimental)</text>
+
+  <!-- VS divider -->
+  <path d="M840 100 C836 220, 844 340, 839 460 M840 620 C844 740, 836 860, 841 
1000" stroke="#1c1c1c" stroke-width="4" stroke-dasharray="2 22" 
stroke-linecap="round" fill="none"/>
+  <text x="840" y="558" text-anchor="middle" font-size="66" font-weight="700" 
fill="#1c1c1c">VS</text>
+
+  <!-- LEFT container -->
+  <path d="M190.9 132.1 Q246.9 132.9 289.2 131.4 Q331.5 129.9 384.8 131.4 
Q438.1 132.9 503.9 130.5 Q569.8 128.1 619.2 129.5 Q668.5 130.9 688.5 130.9 
Q708.5 130.9 708.5 150.9 Q708.5 170.9 706.9 235.0 Q705.3 299.2 706.3 346.6 
Q707.3 393.9 709.1 437.8 Q710.9 481.7 710.7 543.6 Q710.4 605.4 709.8 652.6 
Q709.1 699.8 708.3 750.7 Q707.6 801.5 707.3 865.4 Q707.1 929.3 707.1 949.3 
Q707.0 969.3 687.0 969.3 Q667.0 969.3 614.9 968.2 Q562.9 967.1 507.9 967.7 
Q453.0 968.3 400.1 968.2 Q347.1 968.1 294.7 [...]
+  <text x="400" y="180" text-anchor="middle" font-size="24" 
fill="#1c1c1c">hourly load bumps the version to v101</text>
+
+  <!-- stale entry box (discarded) -->
+  <path d="M235.9 211.5 Q281.0 211.6 320.6 211.6 Q360.3 211.6 395.3 210.9 
Q430.4 210.2 472.5 211.3 Q514.7 212.3 562.1 211.1 Q609.6 209.8 624.6 209.8 
Q639.6 209.7 639.4 224.7 Q639.1 239.7 638.4 284.1 Q637.7 328.6 637.5 343.6 
Q637.2 358.5 622.2 358.6 Q607.2 358.6 572.8 357.9 Q538.4 357.2 496.5 357.7 
Q454.5 358.2 408.5 359.1 Q362.4 359.9 312.3 361.1 Q262.3 362.3 226.2 361.2 
Q190.2 360.0 175.2 360.1 Q160.2 360.1 160.3 345.1 Q160.3 330.1 160.5 285.8 
Q160.8 241.6 160.8 226.6 Q160.9 211.6 175.9 [...]
+  <g stroke="#1c1c1c" stroke-width="3" fill="none">
+    <ellipse cx="238" cy="252" rx="34" ry="12"/>
+    <path d="M204 252 L205 316 M272 252 L271 316 M204 316 Q238 332 272 316"/>
+    <path d="M205 284 Q238 298 271 283" stroke-width="2.4"/>
+  </g>
+  <text x="310" y="266" font-size="27" font-weight="700" fill="#1c1c1c">Cache 
Entry v100</text>
+  <text x="310" y="318" font-size="24" fill="#1c1c1c">stale, discarded</text>
+  <path d="M196 232 C220 258 248 288 282 330 M284 234 C254 264 226 296 198 
328" stroke="#1c1c1c" stroke-width="5" stroke-linecap="round" fill="none"/>
+
+  <!-- big full scan box -->
+  <path d="M238.0 428.8 Q283.8 427.9 322.4 428.2 Q361.0 428.4 399.0 429.0 
Q437.1 429.6 488.0 430.2 Q538.9 430.7 575.3 430.5 Q611.7 430.2 626.7 430.2 
Q641.7 430.3 641.6 445.3 Q641.5 460.3 641.9 486.5 Q642.3 512.8 640.5 549.3 
Q638.7 585.7 639.4 625.9 Q640.1 666.0 640.0 681.0 Q639.9 696.0 624.9 696.0 
Q609.9 696.0 562.9 695.2 Q516.0 694.4 473.9 694.6 Q431.8 694.7 388.0 694.6 
Q344.1 694.5 313.8 694.3 Q283.4 694.2 237.6 695.1 Q191.7 696.0 176.7 696.0 
Q161.7 696.0 161.8 681.0 Q161.8 666.0 162.5 [...]
+  <rect x="220" y="452" width="360" height="44" fill="#f8f7f3" opacity="0.92"/>
+  <text x="400" y="484" text-anchor="middle" font-size="28" font-weight="700" 
fill="#1c1c1c">Scan ALL rowsets [0, v101]</text>
+  <g stroke="#1c1c1c" stroke-width="2.8" fill="#ffffff">
+    <path d="M244.1 530.1 Q255.4 529.8 265.9 530.2 Q276.5 530.7 281.5 530.7 
Q286.5 530.7 286.4 535.7 Q286.3 540.7 286.0 551.5 Q285.8 562.2 285.7 567.2 
Q285.6 572.2 280.6 572.3 Q275.6 572.3 265.3 571.8 Q255.1 571.4 243.9 572.0 
Q232.7 572.6 227.7 572.6 Q222.7 572.7 222.7 567.7 Q222.7 562.7 222.7 551.5 
Q222.7 540.3 222.7 535.3 Q222.7 530.3 227.7 530.4 Q232.7 530.4 244.1 530.1 Z"/>
+    <path d="M318.6 529.9 Q329.9 529.6 341.1 529.8 Q352.2 530.0 357.2 530.0 
Q362.2 530.0 362.2 535.0 Q362.1 540.0 361.9 551.2 Q361.7 562.5 361.6 567.5 
Q361.5 572.5 356.5 572.5 Q351.5 572.4 343.4 572.5 Q335.4 572.6 322.0 572.4 
Q308.6 572.1 303.6 572.1 Q298.6 572.0 298.4 567.0 Q298.3 562.0 298.0 551.2 
Q297.7 540.3 297.5 535.3 Q297.4 530.3 302.4 530.3 Q307.4 530.3 318.6 529.9 Z"/>
+    <path d="M397.5 529.6 Q410.2 529.6 418.7 530.1 Q427.1 530.6 432.1 530.8 
Q437.1 530.9 437.2 535.9 Q437.2 540.9 437.3 551.1 Q437.4 561.3 437.4 566.3 
Q437.4 571.3 432.4 571.3 Q427.4 571.4 414.2 571.7 Q400.9 571.9 392.6 571.8 
Q384.3 571.7 379.3 571.7 Q374.3 571.7 374.3 566.7 Q374.4 561.7 374.5 550.5 
Q374.7 539.4 374.8 534.4 Q374.8 529.4 379.8 529.5 Q384.8 529.6 397.5 529.6 Z"/>
+    <path d="M470.1 530.3 Q479.4 530.0 492.1 529.7 Q504.7 529.5 509.7 529.4 
Q514.7 529.3 514.6 534.2 Q514.6 539.2 514.4 550.6 Q514.3 561.9 514.2 566.9 
Q514.2 571.9 509.2 571.8 Q504.2 571.8 494.6 571.8 Q485.1 571.7 472.6 571.6 
Q460.1 571.4 455.1 571.4 Q450.1 571.3 450.1 566.3 Q450.2 561.3 450.4 551.1 
Q450.6 540.8 450.7 535.8 Q450.8 530.8 455.8 530.7 Q460.8 530.6 470.1 530.3 Z"/>
+    <path d="M542.3 530.9 Q548.1 531.2 557.8 531.0 Q567.4 530.8 572.4 530.9 
Q577.4 530.9 577.4 535.9 Q577.4 540.9 577.4 551.6 Q577.4 562.3 577.4 567.3 
Q577.4 572.3 572.4 572.3 Q567.4 572.3 558.2 572.1 Q548.9 571.8 542.1 572.1 
Q535.3 572.4 530.3 572.4 Q525.3 572.5 525.4 567.5 Q525.5 562.5 525.8 551.5 
Q526.1 540.6 526.2 535.6 Q526.4 530.6 531.4 530.6 Q536.4 530.7 542.3 530.9 Z"/>
+    <path d="M241.7 584.2 Q251.6 583.8 264.1 583.7 Q276.6 583.7 281.6 583.6 
Q286.6 583.5 286.6 588.5 Q286.6 593.5 286.6 604.9 Q286.7 616.2 286.7 621.2 
Q286.7 626.2 281.7 626.3 Q276.7 626.3 265.7 626.3 Q254.7 626.3 243.0 626.5 
Q231.2 626.7 226.2 626.8 Q221.2 626.8 221.2 621.8 Q221.3 616.8 221.5 605.8 
Q221.6 594.8 221.7 589.8 Q221.8 584.8 226.8 584.7 Q231.8 584.6 241.7 584.2 Z"/>
+    <path d="M320.2 583.7 Q331.9 583.9 341.7 584.0 Q351.5 584.1 356.5 584.1 
Q361.5 584.2 361.4 589.2 Q361.4 594.2 361.3 605.3 Q361.3 616.5 361.2 621.5 
Q361.2 626.5 356.2 626.4 Q351.2 626.3 339.8 625.5 Q328.4 624.8 318.4 625.1 
Q308.5 625.4 303.5 625.3 Q298.5 625.2 298.5 620.2 Q298.5 615.2 298.5 604.3 
Q298.5 593.5 298.4 588.5 Q298.4 583.5 303.4 583.5 Q308.4 583.6 320.2 583.7 Z"/>
+    <path d="M397.1 583.7 Q409.9 583.2 419.4 583.4 Q428.8 583.6 433.8 583.5 
Q438.8 583.5 438.6 588.5 Q438.5 593.4 438.0 605.0 Q437.6 616.6 437.4 621.6 
Q437.2 626.6 432.2 626.5 Q427.2 626.5 414.1 626.3 Q401.0 626.1 392.4 626.0 
Q383.7 625.9 378.7 625.8 Q373.7 625.8 373.8 620.8 Q373.8 615.8 374.0 605.1 
Q374.1 594.4 374.2 589.4 Q374.3 584.4 379.3 584.3 Q384.3 584.2 397.1 583.7 Z"/>
+    <path d="M469.9 583.7 Q480.6 584.1 492.4 583.8 Q504.2 583.4 509.2 583.4 
Q514.2 583.4 514.1 588.4 Q514.0 593.4 513.8 604.7 Q513.5 615.9 513.4 620.9 
Q513.3 625.9 508.3 625.9 Q503.3 625.9 494.5 626.1 Q485.6 626.4 472.7 626.0 
Q459.9 625.6 454.9 625.5 Q449.9 625.5 449.8 620.5 Q449.7 615.5 449.6 604.4 
Q449.4 593.3 449.4 588.3 Q449.3 583.3 454.3 583.3 Q459.3 583.3 469.9 583.7 Z"/>
+    <path d="M542.1 583.6 Q548.1 583.6 558.3 583.6 Q568.6 583.6 573.6 583.6 
Q578.6 583.6 578.5 588.6 Q578.5 593.6 578.3 604.7 Q578.2 615.7 578.1 620.7 
Q578.0 625.7 573.0 625.8 Q568.0 625.9 561.5 626.2 Q554.9 626.6 545.4 626.6 
Q535.8 626.6 530.8 626.7 Q525.8 626.9 525.9 621.9 Q525.9 616.9 526.0 605.3 
Q526.0 593.7 526.1 588.7 Q526.1 583.7 531.1 583.7 Q536.1 583.7 542.1 583.6 Z"/>
+  </g>
+  <text x="400" y="668" text-anchor="middle" font-size="23" 
fill="#1c1c1c">whole partition, every hour</text>
+
+  <path d="M400 700 C398 722 402 736 400 756" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M384 740 L400 762 L416 741" stroke="#17997e" stroke-width="5" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+
+  <!-- partial agg box -->
+  <path d="M285.6 762.4 Q319.5 762.9 358.3 763.3 Q397.1 763.6 429.8 762.2 
Q462.4 760.9 506.0 761.7 Q549.5 762.5 564.5 762.5 Q579.5 762.6 579.4 777.6 
Q579.2 792.6 578.9 819.4 Q578.5 846.1 578.4 861.1 Q578.2 876.1 563.2 876.2 
Q548.2 876.2 504.7 876.8 Q461.3 877.3 435.1 876.3 Q408.9 875.2 366.0 877.1 
Q323.1 879.0 288.5 878.2 Q253.8 877.4 238.8 877.5 Q223.8 877.6 223.6 862.6 
Q223.3 847.6 222.7 819.6 Q222.2 791.7 221.9 776.7 Q221.6 761.7 236.6 761.8 
Q251.6 761.8 285.6 762.4 Z" fill="#ffffff"  [...]
+  <text x="400" y="832" text-anchor="middle" font-size="28" font-weight="700" 
fill="#1c1c1c">Partial Aggregate</text>
+
+  <path d="M400 880 C398 898 402 908 400 922" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M384 906 L400 928 L416 907" stroke="#17997e" stroke-width="5" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="400" y="954" text-anchor="middle" font-size="26" font-weight="700" 
fill="#0e8a70">to upstream Merge Agg</text>
+
+  <!-- RIGHT container -->
+  <path d="M1063.4 130.9 Q1124.1 132.5 1164.6 130.5 Q1205.2 128.4 1268.2 128.3 
Q1331.2 128.2 1375.3 128.1 Q1419.4 128.0 1477.6 128.8 Q1535.8 129.7 1555.8 
129.8 Q1575.8 129.8 1575.9 149.8 Q1575.9 169.8 1574.8 231.3 Q1573.7 292.8 
1575.8 345.7 Q1577.9 398.5 1577.0 455.3 Q1576.2 512.0 1576.4 551.7 Q1576.6 
591.5 1577.9 649.5 Q1579.1 707.5 1578.3 764.6 Q1577.5 821.7 1577.1 874.5 
Q1576.7 927.3 1576.7 947.3 Q1576.8 967.3 1556.8 967.3 Q1536.8 967.4 1481.9 
966.3 Q1427.0 965.2 1372.0 967.0 Q1317.0  [...]
+  <text x="1268" y="180" text-anchor="middle" font-size="24" 
fill="#1c1c1c">same hourly load, now at version v101</text>
+
+  <!-- reused entry box (green) -->
+  <path d="M1092.2 210.4 Q1125.9 209.9 1173.1 209.4 Q1220.3 209.0 1268.9 209.4 
Q1317.5 209.9 1360.1 211.5 Q1402.6 213.2 1439.7 212.0 Q1476.7 210.8 1491.7 
210.8 Q1506.7 210.8 1506.7 225.8 Q1506.7 240.8 1506.7 285.2 Q1506.7 329.6 
1506.7 344.6 Q1506.7 359.6 1491.7 359.6 Q1476.7 359.6 1438.9 358.5 Q1401.1 
357.5 1350.1 358.1 Q1299.1 358.7 1270.1 359.2 Q1241.2 359.7 1189.4 360.2 
Q1137.6 360.6 1097.9 360.0 Q1058.1 359.5 1043.1 359.5 Q1028.1 359.5 1028.2 
344.5 Q1028.2 329.5 1028.3 285.2 Q1028.4  [...]
+  <g stroke="#0e8a70" stroke-width="3" fill="none">
+    <ellipse cx="1106" cy="252" rx="34" ry="12"/>
+    <path d="M1072 252 L1073 316 M1140 252 L1139 316 M1072 316 Q1106 332 1140 
316"/>
+    <path d="M1073 284 Q1106 298 1139 283" stroke-width="2.4"/>
+  </g>
+  <text x="1178" y="266" font-size="27" font-weight="700" fill="#1c1c1c">Cache 
Entry v100</text>
+  <text x="1178" y="318" font-size="24" fill="#0e8a70">reused + pinned</text>
+  <path d="M1408 300 L1430 324 L1466 278" stroke="#0e8a70" stroke-width="6" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+
+  <!-- delta scan box -->
+  <path d="M1095.2 429.4 Q1129.3 428.9 1183.1 428.3 Q1237.0 427.6 1274.8 428.0 
Q1312.7 428.4 1327.7 428.3 Q1342.7 428.2 1342.6 443.2 Q1342.6 458.2 1343.0 
493.2 Q1343.3 528.1 1341.6 568.7 Q1339.9 609.4 1341.0 638.6 Q1342.0 667.7 
1342.0 682.7 Q1342.0 697.7 1327.0 697.6 Q1312.0 697.5 1271.9 696.0 Q1231.8 
694.4 1195.7 694.6 Q1159.6 694.9 1110.6 695.3 Q1061.6 695.8 1046.6 695.7 
Q1031.6 695.6 1031.6 680.6 Q1031.5 665.6 1030.5 625.1 Q1029.6 584.7 1030.6 
553.2 Q1031.6 521.8 1031.3 490.9 Q1031.1  [...]
+  <rect x="1052" y="452" width="272" height="76" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="1186" y="482" text-anchor="middle" font-size="27" font-weight="700" 
fill="#1c1c1c">Scan DELTA only</text>
+  <text x="1186" y="518" text-anchor="middle" font-size="25" font-weight="700" 
fill="#0e8a70">(v100, v101]</text>
+  <g stroke="#1c1c1c" stroke-width="2.8" fill="#ffffff">
+    <path d="M1169.9 555.9 Q1180.6 556.3 1195.2 556.2 Q1209.8 556.2 1214.8 
556.3 Q1219.8 556.3 1219.8 561.3 Q1219.7 566.3 1219.6 578.8 Q1219.5 591.3 
1219.4 596.3 Q1219.3 601.3 1214.4 601.4 Q1209.4 601.5 1196.0 602.1 Q1182.7 
602.7 1171.1 602.5 Q1159.5 602.3 1154.5 602.4 Q1149.5 602.5 1149.5 597.5 
Q1149.4 592.5 1149.3 578.9 Q1149.2 565.3 1149.2 560.3 Q1149.1 555.3 1154.1 
555.4 Q1159.1 555.4 1169.9 555.9 Z"/>
+  </g>
+  <text x="1186" y="668" text-anchor="middle" font-size="23" 
fill="#1c1c1c">one hour of new data</text>
+
+  <path d="M1186 700 C1184 722 1188 736 1186 756" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M1170 740 L1186 762 L1202 741" stroke="#17997e" stroke-width="5" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+
+  <!-- partial agg box (right) -->
+  <path d="M1116.7 760.6 Q1145.6 759.7 1185.4 759.7 Q1225.2 759.6 1254.8 759.8 
Q1284.4 760.1 1299.4 760.0 Q1314.4 759.9 1314.5 774.9 Q1314.5 789.9 1314.7 
818.4 Q1314.8 847.0 1314.9 862.0 Q1315.0 877.0 1300.0 877.0 Q1285.0 877.0 
1249.4 876.2 Q1213.8 875.4 1178.0 875.0 Q1142.2 874.6 1115.5 875.7 Q1088.9 
876.9 1073.9 876.9 Q1058.9 876.8 1058.8 861.9 Q1058.6 846.9 1058.4 819.2 
Q1058.1 791.6 1058.0 776.6 Q1057.9 761.6 1072.9 761.5 Q1087.9 761.4 1116.7 
760.6 Z" fill="#ffffff" stroke="#17997e"  [...]
+  <text x="1187" y="832" text-anchor="middle" font-size="27" font-weight="700" 
fill="#1c1c1c">Partial Aggregate</text>
+
+  <!-- cached blocks go straight to merge -->
+  <path d="M1452 362 C1462 470 1462 640 1420 780 C1408 818 1388 850 1354 880" 
stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M1382 872 L1348 886 L1366 854" stroke="#17997e" stroke-width="5" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="1500" y="560" text-anchor="middle" font-size="23" fill="#0e8a70" 
transform="rotate(90 1500 560)">cached partial blocks</text>
+
+  <path d="M1187 880 C1185 898 1189 908 1187 922" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M1171 906 L1187 928 L1203 907" stroke="#17997e" stroke-width="5" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="1240" y="954" text-anchor="middle" font-size="26" font-weight="700" 
fill="#0e8a70">to upstream Merge Agg</text>
+
+  <!-- write-back dashed arrow: middle pulled left, label moved right of it -->
+  <path d="M1052 930 C1016 922 990 904 981 852 C975 764 975 615 977 520 C978 
448 983 402 1022 368" stroke="#0e8a70" stroke-width="4" fill="none" 
stroke-dasharray="14 12" stroke-linecap="round"/>
+  <!-- arrowhead axis aligned with the incoming curve tangent (~50 deg 
up-right) -->
+  <path d="M986.5 378.4 L1026 362 L1020.1 400.2" stroke="#0e8a70" 
stroke-width="4" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="1012" y="615" text-anchor="middle" font-size="23" fill="#0e8a70" 
transform="rotate(-90 1012 615)">write back v101 (delta_count+1)</text>
+</svg>
\ No newline at end of file
diff --git a/static/images/next/query-cache/incremental-merge-dataflow.svg 
b/static/images/next/query-cache/incremental-merge-dataflow.svg
new file mode 100644
index 00000000000..10efafb3e70
--- /dev/null
+++ b/static/images/next/query-cache/incremental-merge-dataflow.svg
@@ -0,0 +1,82 @@
+<svg viewBox="0 0 1680 1050" xmlns="http://www.w3.org/2000/svg"; role="img" 
font-family="'Comic Neue',cursive">
+  <title>Query Cache Incremental Merge: Dataflow inside one Instance</title>
+  <desc>In incremental mode the scan reads only the delta rowsets and feeds 
the unchanged partial aggregation; the cache source emits the pinned cached 
blocks first, streams the delta partial blocks, and on eos writes the 
concatenated blocks back under the new version with delta_count plus one. Entry 
growth is bounded by the compaction threshold and the entry size limits.</desc>
+
+  <defs>
+    <style>@font-face{font-family:'Comic Neue';font-weight:100 
900;src:url(data:font/woff2;base64,d09GMgABAAAAAC4EABEAAAAAXugAAC2lAAIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbjC4cbAZgADQISgmcFREICoGEZPEXATYCJAODIAuBUgAEIAWDJAcgDIEyGx9TJeOYBTgPIETJ/kmiKNOsiUQRbBxAEO1jFP//MTkZQ9gNmKr1Uk4QCSa3aAZJazXtoBHSYdPFfZFZLZ/HKlUwfRH2KcNisUStRmqP/Rq3Uv095rXclVVqSB/yMJtONrp/3SpbdWuMKFuzMIR16Z+J5k4qJ+E55FRHaOyTXP/53OzPvXkJwUIwGRqgQo2mTp1a2qkyprL6YrZyldXI8Pw2wwCVEP5/7wFWESqIRBoIAgZmYkyslTtjkW63dNUsXJQurh3gXLgEXY
 [...]
+    <pattern id="hatch" width="14" height="14" patternTransform="rotate(45)" 
patternUnits="userSpaceOnUse">
+      <line x1="0" y1="0" x2="0" y2="14" stroke="#c9c6bf" stroke-width="3"/>
+    </pattern>
+    <pattern id="dots" width="16" height="16" patternUnits="userSpaceOnUse">
+      <circle cx="4" cy="4" r="1.7" fill="#b9b5ac"/>
+      <circle cx="12" cy="12" r="1.7" fill="#b9b5ac"/>
+    </pattern>
+    <pattern id="greenwash" width="12" height="12" 
patternTransform="rotate(-38)" patternUnits="userSpaceOnUse">
+      <rect width="12" height="12" fill="#eaf6f2"/>
+      <line x1="0" y1="2" x2="12" y2="2" stroke="#bfe4d9" stroke-width="2.6"/>
+      <line x1="0" y1="8" x2="12" y2="8" stroke="#d4ede5" stroke-width="2"/>
+    </pattern>
+  </defs>
+
+  <rect x="0" y="0" width="1680" height="1050" fill="#f8f7f3"/>
+  <text x="840" y="66" font-size="40" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">Incremental Execution inside one Instance</text>
+  <text x="840" y="112" font-size="23" text-anchor="middle" fill="#1c1c1c">the 
decision pinned entry v100 and pre-captured the delta read source; the plan 
itself is unchanged</text>
+  <path d="M183.6 142.4 Q232.5 143.8 283.7 142.2 Q334.9 140.5 398.6 142.1 
Q462.3 143.6 522.6 141.5 Q582.8 139.5 632.7 141.2 Q682.6 142.8 727.4 142.7 
Q772.1 142.5 839.5 142.9 Q907.0 143.3 949.0 142.6 Q990.9 141.8 1050.1 142.4 
Q1109.3 143.1 1170.0 140.1 Q1230.7 137.2 1288.5 139.6 Q1346.3 142.1 1386.9 
142.5 Q1427.5 142.9 1486.3 141.4 Q1545.0 139.9 1565.0 139.9 Q1585.0 139.9 
1585.0 159.9 Q1584.9 179.9 1583.5 229.4 Q1582.1 278.9 1584.9 344.3 Q1587.6 
409.8 1586.7 470.7 Q1585.7 531.6 1586.1 572 [...]
+  <path d="M217.2 188.7 Q253.3 188.3 295.3 189.5 Q337.2 190.6 383.0 190.6 
Q428.7 190.7 470.6 189.6 Q512.6 188.5 555.7 189.2 Q598.9 190.0 633.7 189.9 
Q668.5 189.7 683.5 189.8 Q698.5 189.8 698.8 204.8 Q699.1 219.8 700.2 246.3 
Q701.4 272.8 701.2 295.8 Q701.1 318.8 701.4 333.8 Q701.7 348.8 686.7 348.8 
Q671.7 348.8 633.9 347.8 Q596.1 346.9 547.4 347.0 Q498.7 347.1 466.3 349.2 
Q433.9 351.4 381.9 349.3 Q330.0 347.1 291.3 348.4 Q252.6 349.7 216.4 349.9 
Q180.2 350.0 165.2 350.1 Q150.2 350.1 150.3 [...]
+  <g stroke="#0e8a70" stroke-width="3" fill="none"><ellipse cx="226" cy="232" 
rx="34" ry="11.899999999999999"/><path d="M192 232 L193 296 M260 232 L259 296 
M192 296 Q226 312.65999999999997 260 296"/><path d="M193 264.0 Q226 278.28 259 
263.0" stroke-width="2.4"/></g>
+  <text x="296" y="248" font-size="26" font-weight="700" fill="#1c1c1c">cache 
entry v100 (pinned)</text>
+  <text x="296" y="282" font-size="21" fill="#1c1c1c">partial blocks + slot 
orders</text>
+  <text x="296" y="308" font-size="21" fill="#1c1c1c">+ delta_count, bytes, 
rows</text>
+  <path d="M1061.4 190.8 Q1112.3 191.1 1144.9 189.6 Q1177.6 188.1 1220.5 189.8 
Q1263.4 191.5 1317.8 191.1 Q1372.2 190.7 1401.5 190.5 Q1430.9 190.3 1479.6 
189.6 Q1528.3 188.8 1543.3 188.8 Q1558.3 188.7 1558.6 203.7 Q1558.9 218.7 
1558.6 239.7 Q1558.3 260.7 1559.7 289.8 Q1561.1 318.9 1561.4 333.9 Q1561.7 
348.9 1546.7 348.9 Q1531.7 348.9 1492.0 349.8 Q1452.3 350.6 1410.4 348.8 
Q1368.6 347.0 1324.2 349.2 Q1279.9 351.3 1238.1 350.9 Q1196.3 350.4 1147.8 
350.8 Q1099.3 351.2 1055.0 350.5 Q1010.7  [...]
+  <text x="1004" y="230" font-size="26" font-weight="700" fill="#1c1c1c">write 
back on eos:</text>
+  <text x="1004" y="264" font-size="22" fill="#1c1c1c">insert(key, v101, 
cached clones + delta</text>
+  <text x="1004" y="292" font-size="22" fill="#1c1c1c">blocks, slot orders, 
delta_count + 1)</text>
+  <text x="1004" y="326" font-size="21" fill="#0e8a70">same key: the v100 
entry gets replaced</text>
+  <path d="M227.2 459.4 Q275.1 460.0 312.9 458.9 Q350.7 457.9 395.4 458.8 
Q440.2 459.7 455.2 459.7 Q470.2 459.8 470.3 474.8 Q470.4 489.8 469.7 529.6 
Q468.9 569.5 470.2 600.6 Q471.5 631.7 471.6 646.7 Q471.7 661.7 456.7 661.6 
Q441.7 661.6 390.6 660.2 Q339.5 658.8 297.0 660.8 Q254.4 662.9 218.0 661.4 
Q181.6 660.0 166.6 659.9 Q151.6 659.8 151.4 644.8 Q151.2 629.8 152.0 593.2 
Q152.8 556.5 151.2 522.6 Q149.5 488.6 149.4 473.7 Q149.2 458.7 164.2 458.7 
Q179.2 458.8 227.2 459.4 Z" fill="url(#dots [...]
+  <rect x="170" y="476" width="270" height="74" fill="#f8f7f3" opacity="0.92"/>
+  <text x="190" y="506" font-size="26" font-weight="700" 
fill="#1c1c1c">OlapScan</text>
+  <text x="190" y="540" font-size="22" fill="#1c1c1c">delta only:</text>
+  <text x="190" y="570" font-size="24" font-weight="700" fill="#0e8a70">(v100, 
v101]</text>
+  <text x="190" y="606" font-size="20" fill="#1c1c1c">single scanner, 
parallel</text>
+  <text x="190" y="632" font-size="20" fill="#1c1c1c">builder disabled</text>
+  <path d="M470 560 C500.1 562.2 530.2 561.9 546 560" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M536 546 L556 560 
L537 574" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M619.2 461.2 Q647.6 461.8 680.5 460.1 Q713.4 458.4 746.0 458.9 
Q778.7 459.5 793.7 459.4 Q808.7 459.3 808.8 474.3 Q808.9 489.3 809.7 516.9 
Q810.6 544.5 810.3 587.5 Q809.9 630.6 810.0 645.6 Q810.2 660.6 795.2 660.7 
Q780.2 660.7 744.8 662.0 Q709.5 663.3 683.3 662.9 Q657.1 662.4 624.3 662.0 
Q591.4 661.5 576.4 661.6 Q561.4 661.7 561.4 646.7 Q561.3 631.7 560.0 602.2 
Q558.7 572.8 559.8 531.8 Q560.9 490.8 560.9 475.8 Q560.8 460.8 575.8 460.7 
Q590.8 460.6 619.2 461.2 Z" fill="#ffffff"  [...]
+  <text x="685" y="534" font-size="26" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">Partial</text>
+  <text x="685" y="568" font-size="26" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">Aggregate</text>
+  <text x="685" y="610" font-size="20" text-anchor="middle" 
fill="#1c1c1c">delta rows only</text>
+  <path d="M810 560 C840.1 560.5 870.2 561.3 886 560" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M876 546 L896 560 
L877 574" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M962.8 490.8 Q995.3 492.5 1022.0 491.8 Q1048.6 491.0 1063.6 491.3 
Q1078.6 491.5 1078.8 506.5 Q1079.1 521.5 1079.6 560.2 Q1080.1 598.8 1080.4 
613.8 Q1080.6 628.8 1065.6 628.8 Q1050.6 628.9 1027.1 628.6 Q1003.6 628.3 967.6 
628.7 Q931.5 629.0 916.5 629.0 Q901.5 629.1 901.4 614.1 Q901.2 599.1 900.9 
558.9 Q900.5 518.7 900.3 503.7 Q900.2 488.7 915.2 488.9 Q930.2 489.1 962.8 
490.8 Z" fill="#ffffff" stroke="#17997e" stroke-width="3.4" 
stroke-linejoin="round"/>
+  <text x="990" y="544" font-size="24" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">CacheSink</text>
+  <text x="990" y="576" font-size="21" text-anchor="middle" 
fill="#1c1c1c">data queue</text>
+  <path d="M1080 560 C1110.1 557.6 1140.2 558.9 1156 560" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M1146 546 L1166 
560 L1147 574" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M1236.0 420.3 Q1270.7 419.4 1313.6 419.1 Q1356.5 418.7 1394.0 419.0 
Q1431.6 419.2 1480.7 420.0 Q1529.8 420.9 1544.8 420.9 Q1559.8 420.8 1559.9 
435.8 Q1559.9 450.8 1560.6 482.5 Q1561.3 514.1 1559.8 547.2 Q1558.3 580.3 
1559.5 624.5 Q1560.7 668.7 1560.8 683.7 Q1560.9 698.7 1545.9 698.8 Q1530.9 
698.9 1487.2 698.9 Q1443.5 698.9 1400.0 699.1 Q1356.4 699.3 1321.8 699.2 
Q1287.1 699.1 1244.1 699.9 Q1201.0 700.7 1186.0 700.7 Q1171.0 700.8 1171.1 
685.8 Q1171.1 670.8 1171.0 641.5 Q1170.9  [...]
+  <rect x="1190" y="436" width="340" height="40" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="1194" y="466" font-size="26" font-weight="700" 
fill="#1c1c1c">CacheSource</text>
+  <text x="1194" y="504" font-size="21" fill="#1c1c1c">1. emit cached blocks 
first,</text>
+  <text x="1194" y="530" font-size="21" fill="#1c1c1c">   reordered to this 
query's slot</text>
+  <text x="1194" y="556" font-size="21" fill="#1c1c1c">   order, cloned for 
the write back</text>
+  <text x="1194" y="582" font-size="21" fill="#1c1c1c">2. stream the delta 
blocks</text>
+  <text x="1194" y="608" font-size="21" fill="#1c1c1c">3. on eos: write back 
v101</text>
+  <text x="1194" y="642" font-size="20" fill="#0e8a70">profile: HitCacheStale 
= 1,</text>
+  <text x="1194" y="668" font-size="20" 
fill="#0e8a70">IncrementalDeltaVersions (100, 101]</text>
+  <path d="M1330 350 C1332.0 373.1 1328.9 396.2 1330 406" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M1316 396 L1330 
416 L1344 397" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="1352" y="412" font-size="21" fill="#1c1c1c">cached partial 
blocks</text>
+  <path d="M700 270 C900 264 1150 258 1322 300 C1330 306 1330 318 1330 336" 
stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round"/>
+  <path d="M1365 700 C1363.5 738.5 1365.2 777.0 1365 800" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M1351 790 L1365 
810 L1379 791" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="1365" y="850" font-size="24" text-anchor="middle" font-weight="700" 
fill="#0e8a70">to upstream Merge Agg</text>
+  <path d="M1270 420 C1270.3 397.6 1269.1 375.2 1270 366" stroke="#0e8a70" 
stroke-width="4" fill="none" stroke-linecap="round" stroke-dasharray="14 
12"/><path d="M1256 376 L1270 356 L1284 375" stroke="#0e8a70" stroke-width="4" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M222.1 731.2 Q263.8 732.2 302.9 729.9 Q342.0 727.6 396.0 728.2 
Q450.0 728.8 491.2 729.8 Q532.3 730.7 572.7 730.2 Q613.1 729.6 655.7 728.6 
Q698.3 727.6 738.5 728.0 Q778.7 728.5 793.7 728.5 Q808.7 728.4 808.9 743.4 
Q809.1 758.4 808.7 794.1 Q808.4 829.7 809.6 879.4 Q810.9 929.1 811.1 944.1 
Q811.3 959.1 796.3 959.2 Q781.3 959.2 745.0 958.3 Q708.8 957.4 652.1 959.1 
Q595.5 960.8 551.3 959.7 Q507.2 958.6 472.5 959.2 Q437.7 959.9 402.2 959.5 
Q366.8 959.1 308.7 958.9 Q250.7 958.7 214.6 [...]
+  <rect x="170" y="746" width="560" height="42" fill="#f8f7f3" opacity="0.92"/>
+  <text x="178" y="776" font-size="26" font-weight="700" 
fill="#1c1c1c">entropy control</text>
+  <rect x="170" y="792" width="620" height="140" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="178" y="820" font-size="22" fill="#1c1c1c">every merge appends 
blocks, so after</text>
+  <text x="178" y="848" font-size="22" 
fill="#1c1c1c">query_cache_max_incremental_merge_count</text>
+  <text x="178" y="876" font-size="22" fill="#1c1c1c">merges (BE config, 
default 8) the next query</text>
+  <text x="178" y="904" font-size="22" fill="#1c1c1c">recomputes in full and 
re-bases the entry</text>
+  <path d="M922.6 730.3 Q946.6 730.3 986.6 730.9 Q1026.7 731.5 1057.6 730.7 
Q1088.5 730.0 1103.5 730.0 Q1118.5 729.9 1118.6 744.9 Q1118.8 759.9 1118.5 
795.1 Q1118.1 830.3 1119.4 881.0 Q1120.6 931.7 1120.8 946.7 Q1120.9 961.7 
1105.9 961.7 Q1090.9 961.7 1056.1 960.9 Q1021.3 960.1 986.5 961.8 Q951.8 963.4 
926.0 962.6 Q900.1 961.8 885.1 961.8 Q870.1 961.8 870.0 946.8 Q869.9 931.8 
870.9 896.9 Q871.9 862.1 870.4 811.2 Q868.8 760.3 868.7 745.3 Q868.6 730.3 
883.6 730.3 Q898.6 730.3 922.6 730.3 Z [...]
+  <text x="894" y="772" font-size="25" font-weight="700" fill="#1c1c1c">entry 
too big?</text>
+  <text x="894" y="806" font-size="21" fill="#1c1c1c">over entry_max:</text>
+  <text x="894" y="832" font-size="21" fill="#1c1c1c">still scan only 
the</text>
+  <text x="894" y="858" font-size="21" fill="#1c1c1c">delta, but skip 
the</text>
+  <text x="894" y="884" font-size="21" fill="#1c1c1c">write back</text>
+</svg>
\ No newline at end of file
diff --git a/static/images/next/query-cache/incremental-merge-decision-flow.svg 
b/static/images/next/query-cache/incremental-merge-decision-flow.svg
new file mode 100644
index 00000000000..a82c0410130
--- /dev/null
+++ b/static/images/next/query-cache/incremental-merge-decision-flow.svg
@@ -0,0 +1,98 @@
+<svg viewBox="0 0 1680 1180" xmlns="http://www.w3.org/2000/svg"; role="img" 
font-family="'Comic Neue',cursive">
+  <title>Query Cache Incremental Merge: Decision Flow</title>
+  <desc>Both operators of an instance call get_or_make_decision on the shared 
QueryCacheRuntime. The chain checks the cache key, binlog scans, force refresh, 
the entry lookup and the version. A stale entry is pinned and validated for 
incremental merge; any failing check falls back to a full recompute with one of 
eight reasons visible in the profile.</desc>
+
+  <defs>
+    <style>@font-face{font-family:'Comic Neue';font-weight:100 
900;src:url(data:font/woff2;base64,d09GMgABAAAAAC4EABEAAAAAXugAAC2lAAIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbjC4cbAZgADQISgmcFREICoGEZPEXATYCJAODIAuBUgAEIAWDJAcgDIEyGx9TJeOYBTgPIETJ/kmiKNOsiUQRbBxAEO1jFP//MTkZQ9gNmKr1Uk4QCSa3aAZJazXtoBHSYdPFfZFZLZ/HKlUwfRH2KcNisUStRmqP/Rq3Uv095rXclVVqSB/yMJtONrp/3SpbdWuMKFuzMIR16Z+J5k4qJ+E55FRHaOyTXP/53OzPvXkJwUIwGRqgQo2mTp1a2qkyprL6YrZyldXI8Pw2wwCVEP5/7wFWESqIRBoIAgZmYkyslTtjkW63dNUsXJQurh3gXLgEXY
 [...]
+    <pattern id="hatch" width="14" height="14" patternTransform="rotate(45)" 
patternUnits="userSpaceOnUse">
+      <line x1="0" y1="0" x2="0" y2="14" stroke="#c9c6bf" stroke-width="3"/>
+    </pattern>
+    <pattern id="dots" width="16" height="16" patternUnits="userSpaceOnUse">
+      <circle cx="4" cy="4" r="1.7" fill="#b9b5ac"/>
+      <circle cx="12" cy="12" r="1.7" fill="#b9b5ac"/>
+    </pattern>
+    <pattern id="greenwash" width="12" height="12" 
patternTransform="rotate(-38)" patternUnits="userSpaceOnUse">
+      <rect width="12" height="12" fill="#eaf6f2"/>
+      <line x1="0" y1="2" x2="12" y2="2" stroke="#bfe4d9" stroke-width="2.6"/>
+      <line x1="0" y1="8" x2="12" y2="8" stroke="#d4ede5" stroke-width="2"/>
+    </pattern>
+  </defs>
+
+  <rect x="0" y="0" width="1680" height="1180" fill="#f8f7f3"/>
+  <text x="840" y="66" font-size="40" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">One Decision per Instance</text>
+  <text x="840" y="112" font-size="23" text-anchor="middle" 
fill="#1c1c1c">scan and cache-source operators both call 
get_or_make_decision(): the first caller decides, both see the same 
object</text>
+  <path d="M185.2 139.7 Q235.1 140.3 287.8 141.3 Q340.5 142.3 391.9 139.9 
Q443.2 137.6 497.9 139.5 Q552.5 141.4 612.6 140.6 Q672.6 139.7 726.1 140.3 
Q779.5 141.0 835.4 139.7 Q891.3 138.5 946.1 138.9 Q1000.9 139.3 1048.6 141.0 
Q1096.3 142.7 1162.4 142.3 Q1228.4 141.9 1286.9 141.2 Q1345.4 140.4 1389.2 
140.6 Q1433.1 140.8 1489.9 141.1 Q1546.7 141.5 1566.7 141.5 Q1586.7 141.5 
1586.6 161.5 Q1586.6 181.5 1586.0 237.0 Q1585.4 292.5 1585.9 341.7 Q1586.4 
390.9 1586.7 459.2 Q1586.9 527.6 1585.7 57 [...]
+  <path d="M224.3 189.1 Q267.1 188.5 305.0 189.8 Q342.9 191.1 401.4 189.3 
Q460.0 187.5 499.5 188.5 Q539.0 189.4 579.7 189.5 Q620.4 189.7 665.8 189.4 
Q711.2 189.1 726.2 189.1 Q741.2 189.1 740.9 204.1 Q740.7 219.1 740.5 228.1 
Q740.4 237.2 740.2 252.2 Q739.9 267.2 724.9 267.2 Q709.9 267.1 663.1 267.7 
Q616.3 268.2 577.1 267.5 Q537.9 266.9 483.3 265.7 Q428.7 264.6 388.1 265.7 
Q347.6 266.9 301.2 265.5 Q254.9 264.1 217.5 265.3 Q180.2 266.5 165.2 266.5 
Q150.2 266.5 150.4 251.5 Q150.7 236.5 150.9 [...]
+  <text x="174" y="224" font-size="26" font-weight="700" fill="#1c1c1c">1. 
build the cache key</text>
+  <text x="174" y="254" font-size="21" fill="#1c1c1c">digest + tablet set + 
partition range</text>
+  <path d="M445 268 C445.1 280.6 443.1 293.2 445 294" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M431 284 L445 304 
L459 285" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M224.1 304.4 Q267.0 303.8 315.3 304.3 Q363.6 304.9 403.1 304.6 
Q442.5 304.3 484.0 305.5 Q525.5 306.7 581.0 305.9 Q636.5 305.0 674.1 305.5 
Q711.6 305.9 726.6 306.0 Q741.6 306.0 741.2 321.0 Q740.8 336.0 740.6 345.2 
Q740.4 354.4 740.0 369.4 Q739.6 384.4 724.6 384.4 Q709.6 384.3 660.4 384.7 
Q611.1 385.1 567.6 385.1 Q524.1 385.2 483.0 384.7 Q441.9 384.1 392.7 383.1 
Q343.5 382.0 311.9 383.7 Q280.3 385.3 229.5 384.1 Q178.8 383.0 163.8 382.9 
Q148.8 382.9 149.3 367.9 Q149.7 352.9 150.0 [...]
+  <text x="174" y="340" font-size="26" font-weight="700" fill="#1c1c1c">2. 
row-binlog scan?</text>
+  <text x="174" y="370" font-size="21" fill="#1c1c1c">a different data stream, 
never cache</text>
+  <path d="M445 384 C442.5 396.6 445.5 409.2 445 410" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M431 400 L445 420 
L459 401" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M223.4 422.3 Q266.9 422.1 319.5 422.9 Q372.1 423.8 408.1 422.9 
Q444.1 421.9 484.4 422.5 Q524.6 423.2 580.3 422.1 Q636.1 421.0 673.2 421.8 
Q710.4 422.7 725.4 422.7 Q740.4 422.7 740.6 437.7 Q740.8 452.7 740.9 461.8 
Q741.1 470.9 741.3 485.9 Q741.4 500.9 726.4 500.9 Q711.4 500.8 667.8 501.1 
Q624.2 501.3 577.3 501.4 Q530.3 501.5 494.9 500.3 Q459.5 499.1 411.1 499.0 
Q362.7 498.9 308.4 498.9 Q254.1 498.9 216.4 499.0 Q178.8 499.1 163.8 499.0 
Q148.8 499.0 149.0 484.0 Q149.2 469.0 149.4 [...]
+  <text x="174" y="456" font-size="26" font-weight="700" fill="#1c1c1c">3. 
force refresh?</text>
+  <text x="174" y="486" font-size="21" fill="#1c1c1c">user asked to recompute 
and refill</text>
+  <path d="M445 500 C445.1 512.6 445.6 525.2 445 526" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M431 516 L445 536 
L459 517" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M219.4 539.2 Q260.5 539.3 308.1 538.2 Q355.6 537.1 399.0 537.2 
Q442.3 537.3 487.3 538.5 Q532.2 539.7 581.0 537.1 Q629.7 534.4 670.2 535.4 
Q710.8 536.4 725.8 536.3 Q740.8 536.3 740.7 551.3 Q740.6 566.3 740.5 575.7 
Q740.4 585.1 740.3 600.1 Q740.2 615.1 725.2 615.1 Q710.2 615.2 668.6 614.1 
Q626.9 613.1 576.1 614.2 Q525.3 615.3 483.1 615.3 Q440.9 615.2 404.8 616.1 
Q368.8 616.9 322.8 617.7 Q276.9 618.4 229.1 617.8 Q181.4 617.2 166.4 617.2 
Q151.4 617.3 150.8 602.3 Q150.2 587.3 149.8 [...]
+  <text x="174" y="572" font-size="26" font-weight="700" fill="#1c1c1c">4. 
lookup_any_version(key)</text>
+  <text x="174" y="602" font-size="21" fill="#1c1c1c">exact or stale entry, 
else fill later</text>
+  <path d="M445 616 C442.3 628.6 442.5 641.2 445 642" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M431 632 L445 652 
L459 633" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M220.0 651.5 Q260.8 650.4 314.1 652.6 Q367.4 654.8 403.4 652.8 
Q439.5 650.8 494.4 652.9 Q549.2 655.0 585.0 653.0 Q620.8 650.9 665.7 652.0 
Q710.6 653.0 725.6 653.1 Q740.6 653.1 740.6 668.1 Q740.5 683.1 740.5 691.9 
Q740.5 700.8 740.5 715.8 Q740.4 730.8 725.4 730.8 Q710.4 730.8 662.2 729.8 
Q614.0 728.7 577.4 730.4 Q540.8 732.1 487.3 731.2 Q433.9 730.4 389.0 730.9 
Q344.2 731.4 311.5 730.6 Q278.8 729.9 230.2 731.2 Q181.7 732.5 166.7 732.6 
Q151.7 732.6 151.2 717.6 Q150.7 702.6 150.4 [...]
+  <text x="174" y="688" font-size="26" font-weight="700" fill="#1c1c1c">5. 
cached version == current?</text>
+  <text x="174" y="718" font-size="21" fill="#1c1c1c">equal versions can serve 
directly</text>
+  <path d="M445 732 C445.1 744.6 443.6 757.2 445 758" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M431 748 L445 768 
L459 749" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M216.8 769.9 Q254.3 769.0 308.3 769.8 Q362.3 770.6 406.8 770.2 
Q451.2 769.8 491.5 769.0 Q531.8 768.3 571.5 767.8 Q611.2 767.3 659.8 768.3 
Q708.5 769.3 723.5 769.3 Q738.5 769.2 738.6 784.2 Q738.6 799.2 738.8 828.8 
Q739.1 858.3 738.4 900.3 Q737.8 942.4 737.7 978.2 Q737.7 1014.1 738.6 1046.8 
Q739.5 1079.4 739.6 1094.4 Q739.6 1109.4 724.6 1109.4 Q709.6 1109.4 661.5 
1110.6 Q613.4 1111.7 566.7 1110.4 Q520.0 1109.0 483.3 1110.0 Q446.7 1111.0 
407.2 1111.0 Q367.6 1111.0 324.5 1109.0 Q2 [...]
+  <rect x="168" y="786" width="560" height="40" fill="#f8f7f3" opacity="0.92"/>
+  <text x="174" y="816" font-size="26" font-weight="700" fill="#1c1c1c">6. try 
incremental on the stale entry</text>
+  <text x="174" y="856" font-size="22" fill="#1c1c1c">pin the entry, then 
verify:</text>
+  <text x="174" y="887" font-size="22" fill="#1c1c1c">-  not cloud mode</text>
+  <text x="174" y="918" font-size="22" fill="#1c1c1c">-  cached version < 
current version</text>
+  <text x="174" y="949" font-size="22" fill="#1c1c1c">-  delta_count below the 
compaction threshold</text>
+  <text x="174" y="980" font-size="22" fill="#1c1c1c">-  every tablet: 
append-only keys (DUP, or MoW</text>
+  <text x="174" y="1011" font-size="22" fill="#1c1c1c">   with a clean 
delete-bitmap window), delta</text>
+  <text x="174" y="1042" font-size="22" fill="#1c1c1c">   (cached, current] 
capturable, no delete</text>
+  <text x="174" y="1073" font-size="22" fill="#1c1c1c">   predicates in the 
delta</text>
+  <path d="M1085.7 189.4 Q1131.4 190.5 1169.4 188.9 Q1207.4 187.3 1249.0 188.6 
Q1290.5 189.8 1340.8 188.4 Q1391.1 187.0 1432.3 187.5 Q1473.5 188.0 1512.3 
188.4 Q1551.0 188.8 1566.0 188.8 Q1581.0 188.8 1581.0 203.8 Q1580.9 218.8 
1580.9 241.5 Q1580.8 264.2 1580.8 279.2 Q1580.7 294.2 1565.7 294.3 Q1550.7 
294.3 1512.6 293.8 Q1474.6 293.3 1431.5 294.0 Q1388.3 294.7 1345.6 295.5 
Q1302.8 296.4 1261.8 295.0 Q1220.8 293.7 1167.7 294.1 Q1114.5 294.5 1076.9 
295.3 Q1039.2 296.1 1024.2 296.2 Q1009.2  [...]
+  <text x="1034" y="224" font-size="26" font-weight="700" fill="#1c1c1c">MISS 
without write back</text>
+  <text x="1034" y="254" font-size="21" fill="#1c1c1c">invalid cache key 
(shared decision, one warning)</text>
+  <text x="1034" y="280" font-size="21" fill="#1c1c1c">or a binlog scan: 
neither hits nor fills the cache</text>
+  <path d="M1077.3 336.7 Q1114.4 336.8 1168.4 336.7 Q1222.4 336.6 1251.1 335.8 
Q1279.9 335.0 1323.3 335.1 Q1366.8 335.2 1413.1 336.7 Q1459.3 338.2 1504.7 
337.1 Q1550.0 336.0 1565.0 336.0 Q1580.0 335.9 1579.9 350.9 Q1579.8 365.9 
1579.7 380.6 Q1579.6 395.2 1579.5 410.2 Q1579.4 425.2 1564.4 425.1 Q1549.4 
425.1 1507.2 424.0 Q1464.9 423.0 1417.1 424.6 Q1369.2 426.2 1337.8 423.9 
Q1306.4 421.6 1266.0 422.7 Q1225.6 423.9 1170.0 424.1 Q1114.3 424.4 1076.7 
423.5 Q1039.1 422.7 1024.1 422.6 Q1009.1  [...]
+  <text x="1034" y="370" font-size="26" font-weight="700" fill="#1c1c1c">MISS: 
recompute and write back</text>
+  <text x="1034" y="400" font-size="21" fill="#1c1c1c">force refresh, or no 
entry found yet</text>
+  <path d="M1088.0 465.2 Q1134.6 465.2 1178.2 463.8 Q1221.7 462.3 1260.1 464.4 
Q1298.5 466.5 1341.2 464.1 Q1383.9 461.8 1430.0 463.8 Q1476.0 465.9 1512.2 
464.5 Q1548.4 463.1 1563.4 463.1 Q1578.4 463.0 1578.4 478.0 Q1578.4 493.0 
1578.6 534.5 Q1578.8 576.0 1579.9 623.2 Q1580.9 670.5 1580.0 716.7 Q1579.0 
762.8 1579.0 777.8 Q1579.1 792.8 1564.1 792.8 Q1549.1 792.8 1504.8 793.2 
Q1460.6 793.6 1425.0 792.8 Q1389.5 791.9 1336.2 792.0 Q1283.0 792.0 1241.8 
791.8 Q1200.6 791.5 1162.5 790.8 Q1124.5  [...]
+  <rect x="1026" y="478" width="460" height="42" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="1034" y="508" font-size="26" font-weight="700" fill="#1c1c1c">MISS 
with a fallback reason</text>
+  <rect x="1026" y="526" width="530" height="250" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="1044" y="552" font-size="21" fill="#1c1c1c">"cloud mode"</text>
+  <text x="1044" y="580" font-size="21" fill="#1c1c1c">"cached entry is 
newer"</text>
+  <text x="1044" y="608" font-size="21" fill="#1c1c1c">"delta count reached 
compaction threshold"</text>
+  <text x="1044" y="636" font-size="21" fill="#1c1c1c">"tablet not 
found"</text>
+  <text x="1044" y="664" font-size="21" fill="#1c1c1c">"keys type not 
append-only"</text>
+  <text x="1044" y="692" font-size="21" fill="#1c1c1c">"delta versions not 
capturable"</text>
+  <text x="1044" y="720" font-size="21" fill="#1c1c1c">"delta contains delete 
predicates"</text>
+  <text x="1044" y="748" font-size="21" fill="#1c1c1c">"delta rewrites history 
rows"</text>
+  <path d="M1081.9 831.0 Q1124.0 830.1 1165.9 831.1 Q1207.7 832.0 1258.8 833.2 
Q1309.9 834.4 1341.4 834.0 Q1372.9 833.7 1415.6 832.9 Q1458.3 832.1 1505.0 
832.4 Q1551.6 832.7 1566.6 832.8 Q1581.6 832.8 1581.5 847.8 Q1581.5 862.8 
1581.4 884.7 Q1581.3 906.5 1581.2 921.5 Q1581.1 936.5 1566.1 936.6 Q1551.1 
936.6 1515.4 937.1 Q1479.6 937.6 1428.1 936.8 Q1376.6 936.1 1334.4 936.0 
Q1292.2 936.0 1252.1 936.3 Q1212.1 936.5 1173.6 938.0 Q1135.1 939.6 1087.4 
938.9 Q1039.7 938.2 1024.7 938.3 Q1009.7  [...]
+  <text x="1034" y="866" font-size="26" font-weight="700" fill="#1c1c1c">HIT 
(entry pinned)</text>
+  <text x="1034" y="896" font-size="21" fill="#1c1c1c">serve the cached 
partial blocks, then eos</text>
+  <path d="M1484 884 L1502 903 L1530 866" stroke="#0e8a70" stroke-width="6" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M1090.9 979.7 Q1140.4 980.5 1175.4 979.3 Q1210.4 978.1 1247.0 978.8 
Q1283.6 979.4 1325.2 977.9 Q1366.9 976.3 1415.7 976.9 Q1464.6 977.4 1508.1 
976.9 Q1551.5 976.4 1566.5 976.3 Q1581.5 976.2 1581.1 991.2 Q1580.8 1006.2 
1579.9 1041.8 Q1579.0 1077.4 1578.7 1092.4 Q1578.3 1107.4 1563.3 1107.4 Q1548.3 
1107.4 1509.7 1107.8 Q1471.1 1108.1 1430.4 1108.4 Q1389.6 1108.7 1341.9 1109.6 
Q1294.3 1110.4 1245.7 1108.4 Q1197.1 1106.4 1153.1 1107.2 Q1109.2 1108.1 1075.1 
1108.3 Q1041.1 1108.6 10 [...]
+  <text x="1034" y="1012" font-size="26" font-weight="700" 
fill="#1c1c1c">INCREMENTAL (entry pinned)</text>
+  <text x="1034" y="1042" font-size="21" fill="#1c1c1c">delta read source 
pre-captured at decision time;</text>
+  <text x="1034" y="1068" font-size="21" fill="#1c1c1c">cached blocks + delta 
blocks go upstream together</text>
+  <path d="M1484 1030 L1502 1049 L1530 1012" stroke="#0e8a70" stroke-width="6" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M740 232 C833.1 233.9 926.2 234.4 996 232" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 218 L1006 
232 L987 246" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="220" font-size="21" text-anchor="middle" 
fill="#0e8a70">fails</text>
+  <path d="M740 348 C833.1 349.2 926.2 350.1 996 348" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 334 L1006 
348 L987 362" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="336" font-size="21" text-anchor="middle" 
fill="#0e8a70">yes</text>
+  <path d="M740 462 C833.1 464.9 926.2 461.3 996 462" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 448 L1006 
462 L987 476" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="450" font-size="21" text-anchor="middle" 
fill="#0e8a70">yes</text>
+  <path d="M740 576 C833.1 579.0 926.2 573.5 996 576" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 562 L1006 
576 L987 590" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="564" font-size="21" text-anchor="middle" fill="#0e8a70">not 
found</text>
+  <path d="M740 878 C833.1 876.2 926.2 880.5 996 878" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 864 L1006 
878 L987 892" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="866" font-size="21" text-anchor="middle" 
fill="#0e8a70">yes, equal</text>
+  <path d="M740 700 C833.1 700.5 926.2 700.2 996 700" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 686 L1006 
700 L987 714" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="688" font-size="21" text-anchor="middle" fill="#0e8a70">any 
check fails</text>
+  <path d="M740 1043 C833.1 1042.9 926.2 1045.3 996 1043" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M986 1029 L1006 
1043 L987 1057" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="875" y="1031" font-size="21" text-anchor="middle" 
fill="#0e8a70">all pass</text>
+</svg>
\ No newline at end of file
diff --git a/static/images/next/query-cache/incremental-merge-mow-bitmap.svg 
b/static/images/next/query-cache/incremental-merge-mow-bitmap.svg
new file mode 100644
index 00000000000..7190e43fee0
--- /dev/null
+++ b/static/images/next/query-cache/incremental-merge-mow-bitmap.svg
@@ -0,0 +1,71 @@
+<svg viewBox="0 0 1680 1170" xmlns="http://www.w3.org/2000/svg"; role="img" 
font-family="'Comic Neue',cursive">
+  <title>Query Cache Incremental Merge: Merge-on-Write Delete Bitmap 
Window</title>
+  <desc>A merge-on-write UNIQUE table qualifies for incremental merge per 
tablet by inspecting the delete bitmap of the delta window. Entries stamped 
inside the window that target baseline rowsets mean history was rewritten and 
force one full recompute; entries targeting the delta itself or stamped outside 
the window are harmless.</desc>
+
+  <defs>
+    <style>@font-face{font-family:'Comic Neue';font-weight:100 
900;src:url(data:font/woff2;base64,d09GMgABAAAAAC4EABEAAAAAXugAAC2lAAIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbjC4cbAZgADQISgmcFREICoGEZPEXATYCJAODIAuBUgAEIAWDJAcgDIEyGx9TJeOYBTgPIETJ/kmiKNOsiUQRbBxAEO1jFP//MTkZQ9gNmKr1Uk4QCSa3aAZJazXtoBHSYdPFfZFZLZ/HKlUwfRH2KcNisUStRmqP/Rq3Uv095rXclVVqSB/yMJtONrp/3SpbdWuMKFuzMIR16Z+J5k4qJ+E55FRHaOyTXP/53OzPvXkJwUIwGRqgQo2mTp1a2qkyprL6YrZyldXI8Pw2wwCVEP5/7wFWESqIRBoIAgZmYkyslTtjkW63dNUsXJQurh3gXLgEXY
 [...]
+    <pattern id="hatch" width="14" height="14" patternTransform="rotate(45)" 
patternUnits="userSpaceOnUse">
+      <line x1="0" y1="0" x2="0" y2="14" stroke="#c9c6bf" stroke-width="3"/>
+    </pattern>
+    <pattern id="dots" width="16" height="16" patternUnits="userSpaceOnUse">
+      <circle cx="4" cy="4" r="1.7" fill="#b9b5ac"/>
+      <circle cx="12" cy="12" r="1.7" fill="#b9b5ac"/>
+    </pattern>
+    <pattern id="greenwash" width="12" height="12" 
patternTransform="rotate(-38)" patternUnits="userSpaceOnUse">
+      <rect width="12" height="12" fill="#eaf6f2"/>
+      <line x1="0" y1="2" x2="12" y2="2" stroke="#bfe4d9" stroke-width="2.6"/>
+      <line x1="0" y1="8" x2="12" y2="8" stroke="#d4ede5" stroke-width="2"/>
+    </pattern>
+  </defs>
+
+  <rect x="0" y="0" width="1680" height="1170" fill="#f8f7f3"/>
+  <text x="840" y="66" font-size="40" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">Merge-on-Write: Delete Bitmap Window Check</text>
+  <text x="840" y="112" font-size="23" text-anchor="middle" fill="#1c1c1c">a 
stale entry at v100 wants to merge the delta (v100, v101]: may the window be 
merged on top of the cached blocks?</text>
+  <path d="M186.6 140.5 Q239.9 141.6 297.4 139.4 Q354.9 137.1 408.2 138.2 
Q461.5 139.2 515.1 138.4 Q568.7 137.6 626.2 137.5 Q683.7 137.4 729.8 137.5 
Q775.8 137.7 829.4 137.5 Q882.9 137.3 947.2 138.8 Q1011.5 140.3 1050.7 140.0 
Q1090.0 139.7 1145.2 139.9 Q1200.4 140.1 1261.5 139.8 Q1322.5 139.5 1384.0 
140.2 Q1445.6 141.0 1494.4 140.1 Q1543.2 139.2 1563.2 139.2 Q1583.2 139.2 
1583.3 159.2 Q1583.3 179.2 1584.1 240.0 Q1584.9 300.7 1584.2 345.5 Q1583.4 
390.3 1582.6 456.4 Q1581.8 522.5 1584.2 58 [...]
+  <text x="150" y="212" font-size="24" font-weight="700" 
fill="#1c1c1c">baseline rowsets: already folded into the cached entry</text>
+  <path d="M171.4 236.3 Q183.1 236.3 198.6 236.6 Q214.1 236.9 225.8 236.1 
Q237.4 235.2 251.1 235.5 Q264.7 235.9 278.4 236.2 Q292.1 236.6 308.1 236.8 
Q324.1 237.0 337.2 236.4 Q350.4 235.9 355.4 235.8 Q360.4 235.8 360.3 240.8 
Q360.3 245.8 359.7 255.5 Q359.1 265.2 359.1 276.4 Q359.2 287.5 359.4 299.3 
Q359.5 311.1 359.5 316.1 Q359.4 321.1 354.4 321.1 Q349.4 321.1 334.0 321.4 
Q318.6 321.6 307.9 321.9 Q297.2 322.2 281.8 321.7 Q266.5 321.1 253.0 321.7 
Q239.4 322.2 229.2 321.4 Q219.0 320.6 204.0 [...]
+  <text x="255" y="288" font-size="25" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">[0-60]</text>
+  <path d="M415.2 236.7 Q430.4 236.9 440.3 236.9 Q450.1 237.0 466.2 237.1 
Q482.2 237.2 496.9 237.1 Q511.7 236.9 524.0 237.2 Q536.3 237.6 547.5 236.7 
Q558.7 235.9 573.9 236.3 Q589.1 236.7 594.1 236.7 Q599.1 236.7 599.2 241.7 
Q599.3 246.7 599.2 258.5 Q599.2 270.2 599.3 282.8 Q599.4 295.4 599.8 303.9 
Q600.1 312.3 600.2 317.3 Q600.2 322.3 595.2 322.3 Q590.2 322.2 576.5 321.8 
Q562.7 321.3 551.4 322.0 Q540.1 322.7 521.9 322.1 Q503.8 321.5 492.1 321.7 
Q480.4 321.9 470.0 322.0 Q459.5 322.2 445.2 [...]
+  <text x="495" y="288" font-size="25" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">[61-90]</text>
+  <path d="M656.1 236.7 Q672.3 236.6 684.0 236.1 Q695.8 235.5 706.4 235.6 
Q717.1 235.7 730.6 236.1 Q744.1 236.6 758.2 236.1 Q772.3 235.7 785.3 235.3 
Q798.3 234.9 814.3 235.1 Q830.4 235.3 835.4 235.2 Q840.4 235.2 840.4 240.2 
Q840.3 245.2 840.3 255.4 Q840.3 265.6 840.2 276.3 Q840.1 287.1 840.1 299.2 
Q840.1 311.4 840.1 316.4 Q840.1 321.4 835.1 321.4 Q830.1 321.4 815.9 321.9 
Q801.7 322.3 788.3 322.5 Q774.9 322.6 760.8 321.9 Q746.6 321.2 731.4 321.2 
Q716.3 321.3 704.5 321.3 Q692.8 321.2 678.5 [...]
+  <text x="735" y="288" font-size="25" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">[91-100]</text>
+  <text x="1120" y="212" font-size="24" font-weight="700" fill="#0e8a70">delta 
rowset: (100, 101]</text>
+  <path d="M1146.0 236.2 Q1162.0 236.7 1174.4 236.0 Q1186.9 235.3 1199.9 235.9 
Q1212.9 236.5 1228.0 235.7 Q1243.0 234.9 1257.8 235.8 Q1272.6 236.6 1284.2 
236.7 Q1295.9 236.8 1306.7 236.0 Q1317.4 235.2 1333.5 235.6 Q1349.6 236.1 
1354.6 236.1 Q1359.6 236.1 1359.7 241.1 Q1359.7 246.1 1359.9 257.9 Q1360.1 
269.7 1359.7 280.4 Q1359.4 291.1 1359.6 301.3 Q1359.9 311.5 1359.9 316.5 
Q1359.9 321.5 1354.9 321.5 Q1349.9 321.5 1334.1 321.8 Q1318.2 322.2 1306.9 
321.3 Q1295.5 320.5 1281.5 321.5 Q1267.6  [...]
+  <rect x="1180" y="262" width="130" height="34" fill="#f8f7f3" 
opacity="0.92"/>
+  <text x="1240" y="288" font-size="25" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">v101</text>
+  <path d="M1030 190 C1026 260, 1034 330, 1029 372" stroke="#1c1c1c" 
stroke-width="4" stroke-dasharray="2 22" stroke-linecap="round" fill="none"/>
+  <text x="1030" y="404" font-size="21" text-anchor="middle" 
fill="#1c1c1c">cached v100  |  current v101</text>
+  <text x="150" y="472" font-size="24" font-weight="700" fill="#1c1c1c">delete 
bitmap entries, key = (RowsetId, SegmentId, Version):</text>
+  <path d="M223.3 497.8 Q267.5 496.8 310.9 498.5 Q354.3 500.2 385.2 499.2 
Q416.1 498.1 460.9 500.0 Q505.7 501.8 553.6 500.2 Q601.6 498.5 635.4 499.8 
Q669.2 501.0 684.2 501.1 Q699.2 501.2 699.2 516.2 Q699.2 531.2 699.1 549.1 
Q699.1 566.9 699.1 581.9 Q699.0 596.9 684.0 596.9 Q669.0 596.9 630.7 595.7 
Q592.5 594.5 552.9 594.9 Q513.4 595.2 466.9 595.3 Q420.5 595.4 378.9 596.8 
Q337.4 598.2 291.2 596.4 Q244.9 594.5 212.2 595.2 Q179.5 595.9 164.5 595.9 
Q149.5 595.8 149.4 580.8 Q149.4 565.8 149.3 [...]
+  <text x="174" y="534" font-size="24" font-weight="700" 
fill="#1c1c1c">stamped v101, targets a baseline rowset</text>
+  <text x="174" y="566" font-size="21" fill="#1c1c1c">a backfill upsert 
replaced an old row</text>
+  <path d="M700 548 C742.0 549.7 784.0 546.4 810 548" stroke="#1c1c1c" 
stroke-width="4" fill="none" stroke-linecap="round"/><path d="M800 534 L820 548 
L801 562" stroke="#1c1c1c" stroke-width="4" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M836 520 C857 542 878 559 906 576 M906 520 C882 542 857 556 836 
576" stroke="#1c1c1c" stroke-width="5" stroke-linecap="round" fill="none"/>
+  <text x="930" y="542" font-size="22" fill="#1c1c1c">history rewritten: fall 
back once,</text>
+  <text x="930" y="570" font-size="22" fill="#1c1c1c">"delta rewrites history 
rows"</text>
+  <path d="M223.0 636.5 Q266.5 637.3 306.7 637.8 Q346.8 638.3 388.3 638.2 
Q429.8 638.1 461.6 636.7 Q493.5 635.2 538.4 635.4 Q583.2 635.5 626.4 635.8 
Q669.6 636.1 684.6 636.1 Q699.6 636.1 699.7 651.1 Q699.7 666.1 699.8 692.4 
Q699.9 718.6 700.0 733.6 Q700.0 748.6 685.0 748.6 Q670.0 748.6 636.4 748.1 
Q602.8 747.6 551.0 746.8 Q499.1 746.0 464.0 746.3 Q428.9 746.7 381.3 747.3 
Q333.6 747.9 301.8 748.9 Q269.9 749.9 225.4 749.0 Q181.0 748.2 166.0 748.1 
Q151.0 748.1 150.8 733.1 Q150.6 718.1 150.2 [...]
+  <text x="174" y="670" font-size="24" font-weight="700" 
fill="#1c1c1c">stamped v101, targets the delta rowset</text>
+  <text x="174" y="702" font-size="21" fill="#1c1c1c">the same new key written 
twice, a losing</text>
+  <text x="174" y="730" font-size="21" fill="#1c1c1c">sequence-column row, a 
local delete sign</text>
+  <path d="M700 692 C742.0 689.4 784.0 690.1 810 692" stroke="#17997e" 
stroke-width="4" fill="none" stroke-linecap="round"/><path d="M800 678 L820 692 
L801 706" stroke="#17997e" stroke-width="4" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M842 692 L862 714 L894 672" stroke="#0e8a70" stroke-width="6" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <text x="930" y="686" font-size="22" fill="#1c1c1c">harmless: the delta scan 
applies the</text>
+  <text x="930" y="714" font-size="22" fill="#1c1c1c">bitmap itself while 
reading</text>
+  <path d="M215.6 778.1 Q250.6 776.9 292.1 777.2 Q333.6 777.4 382.8 778.9 
Q432.1 780.4 477.1 779.8 Q522.0 779.2 552.1 779.1 Q582.2 778.9 626.5 780.1 
Q670.8 781.4 685.8 781.4 Q700.8 781.5 700.8 796.5 Q700.8 811.5 700.8 828.2 
Q700.8 844.9 700.7 859.9 Q700.7 874.9 685.7 874.9 Q670.7 875.0 621.9 875.3 
Q573.0 875.6 546.3 876.8 Q519.6 877.9 468.1 876.5 Q416.5 875.0 386.6 875.3 
Q356.7 875.5 308.2 876.5 Q259.6 877.5 220.5 877.2 Q181.4 876.8 166.4 876.9 
Q151.4 876.9 151.3 861.9 Q151.2 846.9 151.0 [...]
+  <text x="174" y="814" font-size="24" font-weight="700" 
fill="#1c1c1c">stamped v40, v103 or pending (v0)</text>
+  <text x="174" y="846" font-size="21" fill="#1c1c1c">before cached, after 
current, unpublished</text>
+  <path d="M700 828 C742.0 827.9 784.0 830.1 810 828" stroke="#17997e" 
stroke-width="4" fill="none" stroke-linecap="round"/><path d="M800 814 L820 828 
L801 842" stroke="#17997e" stroke-width="4" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <text x="930" y="822" font-size="22" fill="#1c1c1c">outside the window 
(v100, v101]:</text>
+  <text x="930" y="850" font-size="22" fill="#1c1c1c">ignored by the 
check</text>
+  <path d="M228.7 917.8 Q276.1 918.0 311.2 917.6 Q346.3 917.3 389.5 918.6 
Q432.6 919.8 482.7 918.1 Q532.9 916.4 573.9 915.9 Q614.9 915.4 648.9 917.4 
Q682.9 919.3 732.0 918.3 Q781.2 917.3 796.2 917.3 Q811.2 917.3 811.2 932.3 
Q811.3 947.3 811.8 981.3 Q812.3 1015.2 812.0 1037.1 Q811.7 1058.9 811.7 1073.9 
Q811.8 1088.9 796.8 1088.9 Q781.8 1088.8 742.6 1089.1 Q703.5 1089.3 664.9 
1088.1 Q626.2 1086.8 568.3 1086.9 Q510.3 1087.1 481.8 1087.6 Q453.3 1088.1 
395.0 1089.0 Q336.8 1089.9 299.0 1088.5  [...]
+  <text x="178" y="954" font-size="26" font-weight="700" fill="#1c1c1c">window 
clean (pure appends):</text>
+  <text x="178" y="988" font-size="22" fill="#1c1c1c">incremental merge, 
exactly as safe as on</text>
+  <text x="178" y="1016" font-size="22" fill="#1c1c1c">a duplicate-key 
table</text>
+  <path d="M690 1000 L712 1024 L748 978" stroke="#0e8a70" stroke-width="6" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M944.2 914.3 Q989.1 913.5 1030.3 914.2 Q1071.4 915.0 1113.1 914.8 
Q1154.8 914.6 1205.9 916.2 Q1257.0 917.9 1305.4 916.4 Q1353.8 914.9 1398.1 
917.2 Q1442.5 919.4 1485.5 918.3 Q1528.5 917.2 1543.5 917.2 Q1558.5 917.3 
1558.6 932.3 Q1558.6 947.3 1558.5 977.9 Q1558.4 1008.5 1558.7 1032.9 Q1559.1 
1057.2 1559.1 1072.2 Q1559.2 1087.2 1544.2 1087.2 Q1529.2 1087.2 1491.5 1088.4 
Q1453.8 1089.5 1407.3 1088.5 Q1360.7 1087.5 1312.8 1086.3 Q1264.9 1085.0 1223.4 
1086.1 Q1181.9 1087.2 1135.4 1 [...]
+  <rect x="890" y="932" width="560" height="42" fill="#f8f7f3" opacity="0.92"/>
+  <text x="898" y="962" font-size="26" font-weight="700" fill="#1c1c1c">window 
rewrote history:</text>
+  <rect x="890" y="976" width="640" height="76" fill="#f8f7f3" opacity="0.92"/>
+  <text x="898" y="1000" font-size="22" fill="#1c1c1c">one full recompute 
re-bases the entry at v101;</text>
+  <text x="898" y="1028" font-size="22" fill="#1c1c1c">the next pure-append 
hour is incremental again</text>
+</svg>
\ No newline at end of file
diff --git a/static/images/next/query-cache/incremental-merge-overview.svg 
b/static/images/next/query-cache/incremental-merge-overview.svg
new file mode 100644
index 00000000000..a9808e57cfe
--- /dev/null
+++ b/static/images/next/query-cache/incremental-merge-overview.svg
@@ -0,0 +1,99 @@
+<svg viewBox="0 0 1680 1500" xmlns="http://www.w3.org/2000/svg"; role="img" 
font-family="'Comic Neue',cursive">
+  <title>Query Cache Incremental Merge: Overview</title>
+  <desc>FE authorizes incremental merge with four static conditions and ships 
one optional thrift flag. On BE a per-fragment QueryCacheRuntime makes one 
idempotent decision per instance, pinning the entry and pre-capturing the 
delta; the unchanged plan then runs in one of three modes and writes the merged 
entry back. Storage-level facts (version graph, delete predicates, the 
merge-on-write delete bitmap window) guard correctness, and profile fields, 
metrics and two switches make the feat [...]
+
+  <defs>
+    <style>@font-face{font-family:'Comic Neue';font-weight:100 
900;src:url(data:font/woff2;base64,d09GMgABAAAAAC4EABEAAAAAXugAAC2lAAIAxAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbjC4cbAZgADQISgmcFREICoGEZPEXATYCJAODIAuBUgAEIAWDJAcgDIEyGx9TJeOYBTgPIETJ/kmiKNOsiUQRbBxAEO1jFP//MTkZQ9gNmKr1Uk4QCSa3aAZJazXtoBHSYdPFfZFZLZ/HKlUwfRH2KcNisUStRmqP/Rq3Uv095rXclVVqSB/yMJtONrp/3SpbdWuMKFuzMIR16Z+J5k4qJ+E55FRHaOyTXP/53OzPvXkJwUIwGRqgQo2mTp1a2qkyprL6YrZyldXI8Pw2wwCVEP5/7wFWESqIRBoIAgZmYkyslTtjkW63dNUsXJQurh3gXLgEXY
 [...]
+    <pattern id="hatch" width="14" height="14" patternTransform="rotate(45)" 
patternUnits="userSpaceOnUse">
+      <line x1="0" y1="0" x2="0" y2="14" stroke="#c9c6bf" stroke-width="3"/>
+    </pattern>
+    <pattern id="dots" width="16" height="16" patternUnits="userSpaceOnUse">
+      <circle cx="4" cy="4" r="1.7" fill="#b9b5ac"/>
+      <circle cx="12" cy="12" r="1.7" fill="#b9b5ac"/>
+    </pattern>
+    <pattern id="greenwash" width="12" height="12" 
patternTransform="rotate(-38)" patternUnits="userSpaceOnUse">
+      <rect width="12" height="12" fill="#eaf6f2"/>
+      <line x1="0" y1="2" x2="12" y2="2" stroke="#bfe4d9" stroke-width="2.6"/>
+      <line x1="0" y1="8" x2="12" y2="8" stroke="#d4ede5" stroke-width="2"/>
+    </pattern>
+  </defs>
+
+  <rect x="0" y="0" width="1680" height="1500" fill="#f8f7f3"/>
+  <text x="840" y="66" font-size="40" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">Query Cache Incremental Merge: the Whole Picture</text>
+  <path d="M195.3 110.4 Q255.6 110.9 297.4 111.8 Q339.2 112.7 403.5 110.1 
Q467.9 107.4 523.8 109.3 Q579.7 111.3 629.3 109.2 Q678.9 107.2 735.9 110.3 
Q792.9 113.3 852.5 111.2 Q912.1 109.2 961.2 108.8 Q1010.3 108.4 1061.6 108.7 
Q1112.9 109.0 1167.2 108.8 Q1221.5 108.7 1274.6 109.4 Q1327.7 110.1 1377.8 
111.7 Q1428.0 113.3 1487.1 112.1 Q1546.2 111.0 1566.2 111.0 Q1586.2 111.1 
1586.2 131.1 Q1586.2 151.1 1585.8 212.1 Q1585.5 273.1 1585.8 316.4 Q1586.1 
359.6 1586.1 379.6 Q1586.1 399.6 1566.1 39 [...]
+  <text x="130" y="156" font-size="30" font-weight="700" 
fill="#0e8a70">FE</text>
+  <path d="M257.4 179.8 Q305.7 180.2 344.8 180.5 Q383.8 180.7 424.2 179.2 
Q464.5 177.8 508.5 178.8 Q552.6 179.8 590.8 180.0 Q629.0 180.2 671.1 179.9 
Q713.2 179.6 743.0 180.1 Q772.7 180.7 821.5 179.9 Q870.4 179.1 885.4 179.0 
Q900.4 179.0 900.5 194.0 Q900.5 209.0 900.6 243.7 Q900.7 278.3 901.0 310.0 
Q901.3 341.7 901.3 356.6 Q901.4 371.6 886.4 371.6 Q871.4 371.6 829.2 372.8 
Q787.0 374.0 753.1 372.2 Q719.1 370.4 670.7 370.2 Q622.3 370.1 585.3 371.7 
Q548.3 373.2 505.6 372.6 Q463.0 372.0 416.6 [...]
+  <text x="204" y="216" font-size="25" font-weight="700" 
fill="#1c1c1c">QueryCacheNormalizer.computeAllowIncremental</text>
+  <text x="204" y="252" font-size="21" fill="#1c1c1c">1. 
enable_query_cache_incremental = true (experimental session switch)</text>
+  <text x="204" y="282" font-size="21" fill="#1c1c1c">2. the cache point 
aggregation does not finalize (merged upstream)</text>
+  <text x="204" y="312" font-size="21" fill="#1c1c1c">3. the aggregation sits 
directly above the olap scan (no nesting)</text>
+  <text x="204" y="342" font-size="21" fill="#1c1c1c">4. selected index 
append-only: DUP_KEYS, or merge-on-write UNIQUE</text>
+  <path d="M1042.1 181.4 Q1074.9 182.0 1119.5 182.7 Q1164.1 183.4 1206.6 182.7 
Q1249.2 182.1 1285.5 182.4 Q1321.8 182.8 1363.5 183.3 Q1405.2 183.7 1446.8 
182.7 Q1488.4 181.7 1503.4 181.8 Q1518.4 181.8 1518.4 196.8 Q1518.4 211.8 
1518.1 241.3 Q1517.8 270.9 1518.2 305.9 Q1518.6 340.9 1518.6 355.9 Q1518.6 
370.9 1503.6 370.9 Q1488.6 370.9 1453.3 369.8 Q1417.9 368.7 1369.9 370.1 
Q1321.9 371.6 1277.9 370.6 Q1233.9 369.5 1208.9 371.1 Q1184.0 372.7 1142.2 
373.0 Q1100.4 373.3 1054.7 372.6 Q1008.9  [...]
+  <text x="1004" y="216" font-size="25" font-weight="700" fill="#1c1c1c">plan 
digest (unchanged)</text>
+  <text x="1004" y="250" font-size="21" fill="#1c1c1c">the switch is not part 
of the digest:</text>
+  <text x="1004" y="276" font-size="21" fill="#1c1c1c">sessions with it on and 
off share the</text>
+  <text x="1004" y="302" font-size="21" fill="#1c1c1c">same entries and 
refresh one another;</text>
+  <text x="1004" y="328" font-size="21" fill="#1c1c1c">reuse mode never 
changes results</text>
+  <path d="M540 372 C540.9 404.9 540.7 437.8 540 456" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M526 446 L540 466 
L554 447" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <text x="566" y="428" font-size="22" fill="#1c1c1c">thrift TQueryCacheParam 
field 8: optional bool allow_incremental</text>
+  <path d="M197.4 467.6 Q258.6 466.6 311.4 468.1 Q364.1 469.5 412.3 469.8 
Q460.5 470.0 520.5 470.1 Q580.5 470.1 629.1 470.5 Q677.6 471.0 737.8 470.0 
Q797.9 468.9 839.3 468.4 Q880.6 467.9 937.2 468.1 Q993.7 468.4 1061.4 467.7 
Q1129.1 466.9 1179.9 468.4 Q1230.6 469.8 1275.1 470.2 Q1319.7 470.6 1375.6 
469.2 Q1431.6 467.8 1488.5 468.7 Q1545.5 469.6 1565.5 469.6 Q1585.5 469.7 
1585.5 489.7 Q1585.5 509.7 1584.9 569.5 Q1584.4 629.3 1585.1 688.6 Q1585.8 
747.9 1585.5 798.8 Q1585.2 849.7 1585.2 869 [...]
+  <text x="130" y="516" font-size="30" font-weight="700" 
fill="#0e8a70">BE</text>
+  <path d="M217.5 541.1 Q253.4 541.2 296.8 542.0 Q340.2 542.7 381.7 542.5 
Q423.2 542.3 468.0 542.2 Q512.8 542.1 559.4 541.3 Q605.9 540.4 638.7 540.7 
Q671.5 541.0 686.5 541.0 Q701.5 541.0 701.4 556.0 Q701.2 571.0 700.4 607.0 
Q699.6 642.9 699.6 695.4 Q699.5 747.8 699.0 783.8 Q698.5 819.7 698.4 834.7 
Q698.2 849.7 683.2 849.8 Q668.2 849.8 632.7 849.5 Q597.1 849.2 547.0 848.3 
Q496.9 847.4 454.2 848.7 Q411.5 849.9 378.9 848.8 Q346.3 847.6 298.5 849.0 
Q250.7 850.4 214.7 850.2 Q178.8 850.1 163.8 [...]
+  <rect x="170" y="556" width="420" height="40" fill="#f8f7f3" opacity="0.92"/>
+  <text x="178" y="586" font-size="25" font-weight="700" 
fill="#1c1c1c">QueryCacheRuntime (fragment)</text>
+  <text x="178" y="620" font-size="21" fill="#1c1c1c">get_or_make_decision(): 
idempotent,</text>
+  <text x="178" y="646" font-size="21" fill="#1c1c1c">one decision per 
instance, entry pinned,</text>
+  <text x="178" y="672" font-size="21" fill="#1c1c1c">delta read source 
pre-captured</text>
+  <path d="M201.8 700.5 Q215.4 700.7 227.7 701.0 Q239.9 701.3 251.2 700.7 
Q262.5 700.1 275.8 700.5 Q289.1 701.0 303.2 700.7 Q317.2 700.5 322.2 700.5 
Q327.2 700.5 327.3 705.5 Q327.3 710.5 327.2 718.0 Q327.1 725.5 327.4 735.9 
Q327.7 746.4 327.7 751.4 Q327.8 756.4 322.8 756.4 Q317.8 756.4 303.1 755.9 
Q288.3 755.4 278.8 756.1 Q269.3 756.9 253.2 756.9 Q237.1 756.9 223.1 757.0 
Q209.1 757.1 198.3 756.8 Q187.4 756.5 182.4 756.5 Q177.4 756.5 177.5 751.5 
Q177.6 746.5 177.9 735.9 Q178.1 725.3 178.1 [...]
+  <text x="253" y="736" font-size="23" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">HIT</text>
+  <path d="M365.6 699.7 Q377.6 699.4 393.7 699.5 Q409.7 699.7 419.6 700.1 
Q429.5 700.6 443.5 700.8 Q457.6 701.1 471.3 700.1 Q485.0 699.1 501.3 700.1 
Q517.6 701.1 530.4 700.7 Q543.2 700.2 548.2 700.2 Q553.2 700.2 553.3 705.2 
Q553.4 710.2 554.1 719.7 Q554.8 729.1 554.6 738.0 Q554.4 746.8 554.6 751.8 
Q554.7 756.8 549.7 756.8 Q544.7 756.7 530.4 757.1 Q516.1 757.4 502.8 757.2 
Q489.5 757.1 476.5 756.7 Q463.6 756.4 448.8 755.6 Q434.1 754.8 420.6 755.7 
Q407.1 756.6 392.0 756.0 Q376.8 755.4 365.7 [...]
+  <text x="449" y="736" font-size="23" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">INCREMENTAL</text>
+  <path d="M201.0 770.4 Q214.3 770.8 224.5 770.1 Q234.7 769.3 251.3 769.4 
Q267.8 769.5 279.9 769.9 Q291.9 770.4 304.9 770.5 Q317.8 770.5 322.8 770.5 
Q327.8 770.6 327.7 775.6 Q327.7 780.6 327.2 790.4 Q326.8 800.2 327.0 808.1 
Q327.3 815.9 327.2 820.9 Q327.1 825.9 322.1 825.9 Q317.1 825.9 306.7 825.8 
Q296.2 825.7 282.1 826.2 Q268.1 826.7 253.0 826.6 Q237.9 826.5 226.9 826.3 
Q216.0 826.1 201.9 825.8 Q187.9 825.4 182.9 825.4 Q177.9 825.4 177.9 820.4 
Q177.9 815.4 178.1 804.5 Q178.3 793.5 178.0 [...]
+  <text x="253" y="806" font-size="23" text-anchor="middle" font-weight="700" 
fill="#1c1c1c">MISS</text>
+  <text x="344" y="806" font-size="20" fill="#1c1c1c">8 fallback reasons in 
the profile</text>
+  <path d="M830.7 541.8 Q872.6 542.5 919.7 540.6 Q966.7 538.7 1011.3 540.2 
Q1055.8 541.8 1103.3 541.1 Q1150.7 540.5 1165.7 540.4 Q1180.7 540.4 1180.7 
555.4 Q1180.6 570.4 1181.0 606.2 Q1181.4 642.0 1181.2 683.9 Q1180.9 725.7 
1180.5 773.5 Q1180.0 821.2 1179.9 836.2 Q1179.9 851.2 1164.9 851.2 Q1149.9 
851.2 1104.6 852.5 Q1059.2 853.8 1020.3 851.6 Q981.5 849.3 926.5 851.6 Q871.6 
853.8 830.7 852.6 Q789.8 851.4 774.8 851.5 Q759.8 851.5 759.8 836.5 Q759.7 
821.5 760.3 780.8 Q760.9 740.1 760.6 690 [...]
+  <text x="784" y="576" font-size="25" font-weight="700" 
fill="#1c1c1c">unchanged plan, three modes</text>
+  <text x="784" y="610" font-size="22" fill="#1c1c1c">OlapScan (all / delta / 
none)</text>
+  <text x="784" y="640" font-size="22" fill="#1c1c1c">Partial Aggregate</text>
+  <text x="784" y="670" font-size="22" fill="#1c1c1c">CacheSink and data 
queue</text>
+  <text x="784" y="700" font-size="22" fill="#1c1c1c">CacheSource emits cached 
and</text>
+  <text x="784" y="730" font-size="22" fill="#1c1c1c">delta blocks side by 
side</text>
+  <text x="784" y="764" font-size="22" fill="#1c1c1c">upstream Merge Agg 
combines</text>
+  <text x="784" y="794" font-size="22" fill="#1c1c1c">partial states as it 
always did</text>
+  <path d="M1306.6 539.6 Q1344.9 540.6 1386.7 538.8 Q1428.5 537.0 1479.7 537.7 
Q1530.8 538.4 1545.8 538.4 Q1560.8 538.4 1560.7 553.4 Q1560.6 568.4 1559.9 
608.4 Q1559.1 648.5 1559.1 699.3 Q1559.2 750.1 1559.0 785.5 Q1558.8 821.0 
1558.7 836.0 Q1558.5 851.0 1543.5 850.9 Q1528.5 850.8 1491.0 851.4 Q1453.4 
851.9 1402.7 850.8 Q1352.1 849.7 1311.4 849.6 Q1270.8 849.4 1255.8 849.4 
Q1240.8 849.3 1240.7 834.3 Q1240.5 819.3 1241.0 776.4 Q1241.4 733.5 1240.6 
687.8 Q1239.7 642.1 1239.2 605.4 Q1238.6  [...]
+  <g stroke="#0e8a70" stroke-width="3" fill="none"><ellipse cx="1310" cy="580" 
rx="34" ry="11.899999999999999"/><path d="M1276 580 L1277 644 M1344 580 L1343 
644 M1276 644 Q1310 660.66 1344 644"/><path d="M1277 612.0 Q1310 626.28 1343 
611.0" stroke-width="2.4"/></g>
+  <text x="1360" y="600" font-size="25" font-weight="700" fill="#1c1c1c">Query 
Cache</text>
+  <text x="1360" y="630" font-size="21" fill="#1c1c1c">(LRU, per BE)</text>
+  <text x="1264" y="690" font-size="21" fill="#1c1c1c">key: digest + tablets + 
range</text>
+  <text x="1264" y="718" font-size="21" fill="#1c1c1c">value: partial blocks, 
version,</text>
+  <text x="1264" y="746" font-size="21" fill="#1c1c1c">slot orders, 
delta_count,</text>
+  <text x="1264" y="774" font-size="21" fill="#1c1c1c">bytes and rows</text>
+  <text x="1264" y="808" font-size="21" fill="#0e8a70">write back replaces 
same key</text>
+  <path d="M700 690 C716.8 691.3 733.6 691.6 738 690" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M728 676 L748 690 
L729 704" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M1180 690 C1196.8 690.6 1213.6 687.4 1218 690" stroke="#0e8a70" 
stroke-width="4" fill="none" stroke-linecap="round" stroke-dasharray="14 
12"/><path d="M1208 676 L1228 690 L1209 704" stroke="#0e8a70" stroke-width="4" 
fill="none" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M196.2 960.6 Q258.4 961.8 309.9 962.0 Q361.4 962.2 408.6 961.7 
Q455.7 961.1 521.7 961.1 Q587.7 961.0 640.3 961.9 Q692.9 962.8 732.1 960.5 
Q771.2 958.2 838.1 960.8 Q905.0 963.4 955.7 963.0 Q1006.4 962.5 1063.9 961.5 
Q1121.3 960.6 1177.2 961.6 Q1233.1 962.6 1290.7 962.6 Q1348.2 962.6 1382.5 
962.5 Q1416.8 962.3 1481.4 961.8 Q1546.0 961.4 1566.0 961.4 Q1586.0 961.4 
1586.1 981.4 Q1586.1 1001.4 1585.6 1049.9 Q1585.0 1098.3 1585.8 1134.6 Q1586.6 
1170.8 1586.7 1190.8 Q1586.8 1210.8 15 [...]
+  <text x="130" y="1006" font-size="30" font-weight="700" 
fill="#0e8a70">Storage</text>
+  <path d="M242.4 1031.3 Q273.0 1031.2 320.1 1032.1 Q367.2 1032.9 398.7 1032.1 
Q430.3 1031.3 476.9 1031.6 Q523.5 1032.0 556.0 1030.7 Q588.4 1029.4 603.4 
1029.3 Q618.4 1029.3 618.6 1044.3 Q618.7 1059.3 619.2 1104.3 Q619.6 1149.4 
619.7 1164.4 Q619.9 1179.4 604.9 1179.4 Q589.9 1179.4 553.3 1180.1 Q516.8 
1180.9 479.5 1180.9 Q442.2 1180.9 409.5 1180.4 Q376.8 1179.9 336.3 1179.4 
Q295.9 1179.0 252.5 1179.2 Q209.1 1179.5 194.1 1179.5 Q179.1 1179.5 179.4 
1164.5 Q179.6 1149.5 180.4 1105.5 Q181.2 1 [...]
+  <text x="204" y="1066" font-size="25" font-weight="700" 
fill="#1c1c1c">version graph</text>
+  <text x="204" y="1100" font-size="21" fill="#1c1c1c">capture exactly 
(cached, current];</text>
+  <text x="204" y="1126" font-size="21" fill="#1c1c1c">compacted away: 
VERSION_ALREADY_</text>
+  <text x="204" y="1152" font-size="21" fill="#1c1c1c">MERGED, fall back</text>
+  <path d="M723.4 1032.3 Q755.4 1033.2 796.1 1030.9 Q836.8 1028.5 874.9 1029.1 
Q912.9 1029.7 947.8 1030.7 Q982.8 1031.7 1027.3 1030.8 Q1071.8 1030.0 1086.8 
1029.9 Q1101.8 1029.8 1101.6 1044.8 Q1101.5 1059.8 1101.2 1104.2 Q1100.8 1148.6 
1100.7 1163.6 Q1100.6 1178.6 1085.6 1178.7 Q1070.6 1178.8 1033.5 1180.2 Q996.5 
1181.6 962.5 1179.7 Q928.6 1177.8 890.5 1179.3 Q852.3 1180.8 802.8 1180.0 
Q753.3 1179.2 722.5 1180.2 Q691.7 1181.1 676.7 1181.2 Q661.7 1181.3 661.7 
1166.3 Q661.6 1151.3 661.5 11 [...]
+  <text x="684" y="1066" font-size="25" font-weight="700" 
fill="#1c1c1c">delete predicates</text>
+  <text x="684" y="1100" font-size="21" fill="#1c1c1c">a DELETE inside the 
delta removes</text>
+  <text x="684" y="1126" font-size="21" fill="#1c1c1c">rows already folded 
into the entry:</text>
+  <text x="684" y="1152" font-size="21" fill="#1c1c1c">fall back</text>
+  <path d="M1221.0 1029.5 Q1272.6 1030.6 1308.0 1029.4 Q1343.4 1028.3 1391.0 
1028.6 Q1438.5 1028.9 1484.0 1028.8 Q1529.5 1028.6 1544.5 1028.6 Q1559.5 1028.6 
1559.7 1043.6 Q1559.9 1058.6 1560.4 1103.9 Q1560.9 1149.2 1561.0 1164.2 Q1561.2 
1179.2 1546.2 1179.3 Q1531.2 1179.3 1482.5 1179.8 Q1433.8 1180.2 1397.6 1181.1 
Q1361.4 1182.0 1303.4 1180.5 Q1245.4 1178.9 1207.1 1179.6 Q1168.7 1180.2 1153.7 
1180.3 Q1138.7 1180.3 1138.8 1165.3 Q1138.9 1150.3 1139.1 1104.4 Q1139.3 1058.4 
1139.3 1043.4 Q1 [...]
+  <text x="1164" y="1066" font-size="25" font-weight="700" fill="#1c1c1c">MoW 
delete bitmap</text>
+  <text x="1164" y="1100" font-size="21" fill="#1c1c1c">window entries 
targeting baseline</text>
+  <text x="1164" y="1126" font-size="21" fill="#1c1c1c">rowsets mean rewritten 
history:</text>
+  <text x="1164" y="1152" font-size="21" fill="#1c1c1c">fall back once, then 
self-heal</text>
+  <path d="M400 1030 C401.1 983.1 399.8 936.2 400 906" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M386 916 L400 896 
L414 915" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M880 1030 C880.1 983.1 878.8 936.2 880 906" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M866 916 L880 896 
L894 915" stroke="#17997e" stroke-width="5" fill="none" stroke-linecap="round" 
stroke-linejoin="round"/>
+  <path d="M1350 1030 C1350.2 983.1 1351.8 936.2 1350 906" stroke="#17997e" 
stroke-width="5" fill="none" stroke-linecap="round"/><path d="M1336 916 L1350 
896 L1364 915" stroke="#17997e" stroke-width="5" fill="none" 
stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="M195.7 1280.1 Q257.8 1280.6 303.7 1280.1 Q349.6 1279.7 397.6 1279.8 
Q445.5 1279.9 511.6 1278.6 Q577.6 1277.3 619.2 1278.3 Q660.9 1279.3 714.9 
1278.9 Q768.9 1278.6 825.9 1277.4 Q882.9 1276.2 938.7 1278.6 Q994.4 1280.9 
1052.9 1279.0 Q1111.4 1277.1 1155.4 1276.7 Q1199.4 1276.3 1273.0 1278.3 Q1346.6 
1280.3 1392.8 1279.6 Q1439.0 1278.9 1491.1 1278.8 Q1543.2 1278.6 1563.2 1278.6 
Q1583.2 1278.5 1583.5 1298.5 Q1583.7 1318.5 1584.3 1359.0 Q1584.8 1399.4 1585.1 
1419.4 Q1585.3 1439.4 156 [...]
+  <text x="130" y="1326" font-size="27" font-weight="700" 
fill="#1c1c1c">Observe and control</text>
+  <text x="130" y="1366" font-size="22" fill="#1c1c1c">profile: HitCache, 
HitCacheStale, IncrementalDeltaVersions, IncrementalFallbackReason, 
InsertCache</text>
+  <text x="130" y="1396" font-size="22" fill="#1c1c1c">metrics: 
stale_hit_total, incremental_fallback_total, write_back_total (prefix 
doris_be_query_cache_)</text>
+  <text x="130" y="1426" font-size="22" fill="#1c1c1c">controls: 
enable_query_cache_incremental (session), 
query_cache_max_incremental_merge_count (BE config, default 8, 0 
disables)</text>
+</svg>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to