<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Olap on Tarragon</title><link>https://tarrragon.github.io/blog/tags/olap/</link><description>Recent content in Olap on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/olap/index.xml" rel="self" type="application/rss+xml"/><item><title>Spanner ↔ BigQuery federation：OLTP/OLAP 分工、federated query、Data Boost、何時把分析 workload 分出去</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/spanner/bigquery-federation/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/spanner/bigquery-federation/</guid><description>&lt;blockquote>
&lt;p>本文是 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Cloud Spanner&lt;/a> overview 的 implementation-layer deep article、寫作參照 &lt;a href="https://tarrragon.github.io/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/" data-link-title="Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證" data-link-desc="vendor overview 飽和後要寫單一功能深度文章、需要選題與結構依據時回來。這套方法論的驗證來源與 cadence variant 在高風險場景（同 vendor sub-tool 系列）的實證。">vendor deep article methodology&lt;/a>。Overview 已說明 Spanner 在全球 OLTP 譜系的定位、本文聚焦 &lt;em>Spanner ↔ BigQuery federation&lt;/em> — OLTP 與 OLAP 的責任分工、以及讓分析查詢存取 OLTP 活資料的整合機制。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="核心定位oltp-與-olap-是兩種不同的資料責任">核心定位：OLTP 與 OLAP 是兩種不同的資料責任&lt;/h2>
&lt;p>Spanner ↔ BigQuery federation 的責任是讓「分析查詢」存取「交易資料」、同時把 OLTP 與 OLAP 兩種根本不同的工作負載分開、各自用適合的引擎與運算資源。Spanner 承擔交易責任 — 低延遲、高並發、行級讀寫、強一致;BigQuery 承擔分析責任 — 掃描大量資料、複雜聚合、欄式儲存、吞吐優先。federation 是讓這兩種責任協作的橋、不是讓一個引擎兼做兩件事。&lt;/p>
&lt;p>把這條分工放最前面、是因為最常見的反模式是「在 OLTP 庫上直接跑分析查詢」。一個掃描全表做月度營收聚合的查詢、跑在 Spanner 上會吃掉本該服務交易的 CPU、把 OLTP 的 p99 latency 拖垮。federation 的價值是讓分析查詢「邏輯上看得到 OLTP 資料、物理上不搶 OLTP 資源」。理解這點、才能正確判斷哪些查詢該留在 Spanner、哪些該推到 BigQuery。&lt;/p>
&lt;h2 id="問題情境分析查詢正在拖垮交易系統">問題情境：分析查詢正在拖垮交易系統&lt;/h2>
&lt;p>federation 的價值、在「分析需求與交易需求共用同一個 OLTP 庫、互相干擾」的壓力下浮現。讀者徵兆：BI 團隊的 dashboard 每小時跑全表聚合、每次跑都讓 Spanner CPU spike、交易 p99 跟著抖;資料團隊想做 ad-hoc 分析、卻被告知「不要在 production Spanner 上跑大查詢」;為了避免干擾、團隊每天 batch export 一次到 BigQuery、但分析師抱怨資料延遲一天、看不到當天的活資料。&lt;/p>
&lt;p>真實壓力場景：全球電商把訂單寫進 Spanner、營運團隊要即時看「過去一小時各區域的訂單趨勢」。這個查詢需要近即時的活資料（不能等隔日 batch）、又是掃描大量 row 的聚合（不該跑在 OLTP 上）。兩個需求拉扯：要新鮮就得查 Spanner 活資料、要不干擾交易就得分到分析引擎。federation + Data Boost 正是為了同時滿足這兩端 — 查 Spanner 的活資料、但用獨立運算資源。&lt;/p>
&lt;p>Case anchor：&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Cloud Spanner planetary scale&lt;/a> 提供「Spanner 定位在 OLTP、analytics workload 交給 BigQuery」的分工 anchor — overview 已指出 Spanner 的不適用場景包含「需要 OLAP 分析能力」、替代是跟 BigQuery 整合。&lt;strong>dogfood 邊界明示&lt;/strong>：9.C10 是 Google 內部 dogfood case、未展開 federation 實作細節;本文 federation 機制、Data Boost 行為均以 GCP vendor 規格 + 通用 OLTP/OLAP 工程展開、case 僅作分工壓力 anchor。&lt;/p>
&lt;h2 id="核心機制external-dataset-federated-query-與-data-boost">核心機制：external dataset federated query 與 Data Boost&lt;/h2>
&lt;p>federation 讓 BigQuery 把 Spanner database 註冊成 &lt;em>external dataset&lt;/em>、之後用標準 BigQuery SQL 直接查 Spanner 的表、查詢在執行時把資料從 Spanner 拉進 BigQuery 的執行引擎。資料不複製、查的是 Spanner 當前狀態 — 這是 federation 跟「定期 export 一份 copy 到 BigQuery」的根本差異:federated query 看到的是活資料、export 看到的是某個時間點的快照。&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是 <a href="/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Cloud Spanner</a> overview 的 implementation-layer deep article、寫作參照 <a href="/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/" data-link-title="Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證" data-link-desc="vendor overview 飽和後要寫單一功能深度文章、需要選題與結構依據時回來。這套方法論的驗證來源與 cadence variant 在高風險場景（同 vendor sub-tool 系列）的實證。">vendor deep article methodology</a>。Overview 已說明 Spanner 在全球 OLTP 譜系的定位、本文聚焦 <em>Spanner ↔ BigQuery federation</em> — OLTP 與 OLAP 的責任分工、以及讓分析查詢存取 OLTP 活資料的整合機制。</p></blockquote>
<hr>
<h2 id="核心定位oltp-與-olap-是兩種不同的資料責任">核心定位：OLTP 與 OLAP 是兩種不同的資料責任</h2>
<p>Spanner ↔ BigQuery federation 的責任是讓「分析查詢」存取「交易資料」、同時把 OLTP 與 OLAP 兩種根本不同的工作負載分開、各自用適合的引擎與運算資源。Spanner 承擔交易責任 — 低延遲、高並發、行級讀寫、強一致;BigQuery 承擔分析責任 — 掃描大量資料、複雜聚合、欄式儲存、吞吐優先。federation 是讓這兩種責任協作的橋、不是讓一個引擎兼做兩件事。</p>
<p>把這條分工放最前面、是因為最常見的反模式是「在 OLTP 庫上直接跑分析查詢」。一個掃描全表做月度營收聚合的查詢、跑在 Spanner 上會吃掉本該服務交易的 CPU、把 OLTP 的 p99 latency 拖垮。federation 的價值是讓分析查詢「邏輯上看得到 OLTP 資料、物理上不搶 OLTP 資源」。理解這點、才能正確判斷哪些查詢該留在 Spanner、哪些該推到 BigQuery。</p>
<h2 id="問題情境分析查詢正在拖垮交易系統">問題情境：分析查詢正在拖垮交易系統</h2>
<p>federation 的價值、在「分析需求與交易需求共用同一個 OLTP 庫、互相干擾」的壓力下浮現。讀者徵兆：BI 團隊的 dashboard 每小時跑全表聚合、每次跑都讓 Spanner CPU spike、交易 p99 跟著抖;資料團隊想做 ad-hoc 分析、卻被告知「不要在 production Spanner 上跑大查詢」;為了避免干擾、團隊每天 batch export 一次到 BigQuery、但分析師抱怨資料延遲一天、看不到當天的活資料。</p>
<p>真實壓力場景：全球電商把訂單寫進 Spanner、營運團隊要即時看「過去一小時各區域的訂單趨勢」。這個查詢需要近即時的活資料（不能等隔日 batch）、又是掃描大量 row 的聚合（不該跑在 OLTP 上）。兩個需求拉扯：要新鮮就得查 Spanner 活資料、要不干擾交易就得分到分析引擎。federation + Data Boost 正是為了同時滿足這兩端 — 查 Spanner 的活資料、但用獨立運算資源。</p>
<p>Case anchor：<a href="/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Cloud Spanner planetary scale</a> 提供「Spanner 定位在 OLTP、analytics workload 交給 BigQuery」的分工 anchor — overview 已指出 Spanner 的不適用場景包含「需要 OLAP 分析能力」、替代是跟 BigQuery 整合。<strong>dogfood 邊界明示</strong>：9.C10 是 Google 內部 dogfood case、未展開 federation 實作細節;本文 federation 機制、Data Boost 行為均以 GCP vendor 規格 + 通用 OLTP/OLAP 工程展開、case 僅作分工壓力 anchor。</p>
<h2 id="核心機制external-dataset-federated-query-與-data-boost">核心機制：external dataset federated query 與 Data Boost</h2>
<p>federation 讓 BigQuery 把 Spanner database 註冊成 <em>external dataset</em>、之後用標準 BigQuery SQL 直接查 Spanner 的表、查詢在執行時把資料從 Spanner 拉進 BigQuery 的執行引擎。資料不複製、查的是 Spanner 當前狀態 — 這是 federation 跟「定期 export 一份 copy 到 BigQuery」的根本差異:federated query 看到的是活資料、export 看到的是某個時間點的快照。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">-- BigQuery 端：透過 external connection 查 Spanner 活資料
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="n">region</span><span class="p">,</span><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">order_count</span><span class="p">,</span><span class="w"> </span><span class="k">SUM</span><span class="p">(</span><span class="n">total</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">revenue</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="n">EXTERNAL_QUERY</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">  </span><span class="s1">&#39;my-project.us-central1.spanner-conn&#39;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">  </span><span class="s1">&#39;SELECT region, total FROM orders WHERE created_at &gt; TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)&#39;</span><span class="w">
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">region</span><span class="p">;</span></span></span></code></pre></div><h3 id="data-boost分析查詢的-workload-隔離">Data Boost：分析查詢的 workload 隔離</h3>
<p>federated query 直接查 Spanner、預設仍消耗 Spanner instance 的運算資源 — 大分析查詢還是會干擾 OLTP。Data Boost 解的就是這層:它讓分析查詢用 <em>獨立的、按需配置的運算資源</em> 讀 Spanner 資料、不消耗服務交易的 instance CPU。Data Boost 讀的是同一份 storage、但用獨立 compute、所以「分析查詢看活資料」與「不干擾 OLTP」可以同時成立。</p>
<p>這是 federation 整套機制的關鍵 — 沒有 Data Boost、federated query 只是把查詢入口換到 BigQuery、底層仍搶 Spanner CPU;有了 Data Boost、workload 隔離才真正成立。Data Boost 適合 batch / ad-hoc 的大型分析讀取、按使用量計費、不需要預先 provision。</p>
<blockquote>
<p><strong>Scope warning</strong>：external dataset / EXTERNAL_QUERY 的語法、Data Boost 的計費模型與資源隔離邊界屬 GCP 規格、逐版本演進。實作前 cross-verify <a href="https://cloud.google.com/bigquery/docs/spanner-federated-queries">BigQuery Spanner federation</a> 與 <a href="https://cloud.google.com/spanner/docs/databoost/databoost-overview">Data Boost 官方文件</a>、不可依本文當最終依據。</p></blockquote>
<h3 id="兩條整合路線federation-vs-change-stream-to-bigquery">兩條整合路線：federation vs change-stream-to-BigQuery</h3>
<p>把 Spanner 資料給 BigQuery 分析有兩條路線、取捨不同：</p>
<table>
  <thead>
      <tr>
          <th>路線</th>
          <th>資料新鮮度</th>
          <th>對 OLTP 影響</th>
          <th>適合場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Federated query + Data Boost</td>
          <td>查詢當下的活資料</td>
          <td>Data Boost 隔離、不搶 CPU</td>
          <td>ad-hoc 分析、即時 dashboard、低頻大查詢</td>
      </tr>
      <tr>
          <td>Change stream → BigQuery</td>
          <td>近即時持續同步</td>
          <td>change stream 讀取耗少量 CPU</td>
          <td>高頻分析、需要在 BigQuery 落地的歷史資料</td>
      </tr>
  </tbody>
</table>
<p>federation 是「需要時去查」、change stream 是「持續推一份到 BigQuery 落地」。federation 適合不需要把資料常駐 BigQuery、偶爾查活資料的場景;change stream（見 <a href="../change-streams-cdc/">change-streams-cdc</a>）適合要在 BigQuery 累積歷史、做高頻或需要 BigQuery 原生效能的分析。兩者不互斥 — 即時 ad-hoc 用 federation、長期歷史分析用 change stream 落地。</p>
<h2 id="操作流程建立-connectionfederated-query啟用-data-boost">操作流程：建立 connection、federated query、啟用 Data Boost</h2>
<h3 id="step-1建立-bigquery--spanner-external-connection">Step 1：建立 BigQuery → Spanner external connection</h3>
<p>在 BigQuery 建立指向 Spanner 的 external connection、設定 IAM 讓 BigQuery service account 有讀 Spanner 的權限。驗證：用 <code>EXTERNAL_QUERY</code> 跑一個簡單 <code>SELECT 1</code> 確認 connection 通、權限正確。</p>
<h3 id="step-2跑-federated-query-並確認查的是活資料">Step 2：跑 federated query 並確認查的是活資料</h3>
<p>跑一個帶時間條件的 federated query、在 Spanner 端寫一筆新資料、立即用 federated query 確認讀得到 — 驗證它查的是活資料、不是快照。這步確立 federation 的核心性質。</p>
<h3 id="step-3對大分析查詢啟用-data-boost-並驗證隔離">Step 3：對大分析查詢啟用 Data Boost 並驗證隔離</h3>
<p>對會掃描大量資料的分析查詢啟用 Data Boost、然後在跑分析查詢的同時觀測 Spanner OLTP 的 CPU 與 p99 latency。驗證點：開 Data Boost 後、大分析查詢執行期間 Spanner OLTP CPU 不應 spike、交易 p99 不應退化。這是 Data Boost 隔離是否生效的直接 evidence — 若 OLTP CPU 仍 spike、表示查詢沒走 Data Boost。</p>
<h3 id="step-4rollback-boundary">Step 4：rollback boundary</h3>
<p>federation 是讀取路徑、不改 Spanner 資料、rollback 成本低 — 停掉 federated query 即可、不影響 OLTP。決策的回退在「分析需求是否該用 federation」:若 federated query 即使開 Data Boost 仍無法滿足效能 / 成本、回退路徑是改用 change stream 把資料落地 BigQuery、用 BigQuery 原生效能查。</p>
<h2 id="失敗模式未隔離的查詢拖垮-oltp資料一致性誤解過度依賴-federation">失敗模式：未隔離的查詢拖垮 OLTP、資料一致性誤解、過度依賴 federation</h2>
<h3 id="federated-query-未開-data-boost拖垮-oltp">Federated query 未開 Data Boost、拖垮 OLTP</h3>
<p>團隊用 federated query 跑大分析查詢、但沒啟用 Data Boost、查詢直接吃 Spanner instance CPU、把交易 p99 拖垮。徵兆是「BI 查詢一跑、交易 latency 就抖」、Spanner CPU 在分析查詢期間 spike。修法是對所有大分析查詢啟用 Data Boost、把「federation = workload 隔離」這個假設明確驗證 — federation 本身不保證隔離、Data Boost 才保證。這個失敗的代價是它直接傷害 production 交易、不是只影響分析。</p>
<h3 id="把-federated-query-的快照當成跨系統強一致">把 federated query 的快照當成跨系統強一致</h3>
<p>federated query 讀的是 Spanner 的活資料、但這份分析結果是「查詢執行那一刻」的快照、不是跟某個 OLTP transaction 綁定的一致點。團隊若把 federated 分析結果當成「跟某筆交易嚴格對齊的數字」、會在對帳場景出錯 — 分析查詢跨多張表掃描時、不同表讀到的時間點可能略有差異、不像單一 OLTP transaction 有 external consistency 的全序保證。</p>
<p>這個失敗的代價在它的隱蔽性:多數分析場景對「秒級的時間點差異」不敏感、所以平時看不出問題;但在「分析數字被當成財務對帳依據」的場景、這個鬆散的一致性會讓對帳對不上、且很難 debug — 因為資料「看起來都對」、只是時間點不嚴格對齊。修法是分清分析查詢的一致性需求:近似趨勢分析、federation 的快照足夠;需要跟交易嚴格對齊的對帳、要用 Spanner 的 read-only transaction 配明確 timestamp bound、或在 OLTP 側生成對帳快照、不靠跨表 federated 掃描拼湊。回退路徑是把「需要強一致對帳」的查詢移回 Spanner read-only transaction、不要硬用 federation 省事。</p>
<h3 id="把所有分析都堆在-federation不評估落地-bigquery">把所有分析都堆在 federation、不評估落地 BigQuery</h3>
<p>團隊把所有分析都用 federated query 直查 Spanner、即使是高頻、重複、不需要活資料的查詢。federated query 每次都從 Spanner 拉資料、高頻重複查的成本與延遲都高於「資料已落地 BigQuery、用 BigQuery 原生欄式儲存查」。徵兆是同樣的分析查詢高頻跑、每次都付 federation 的拉取成本。<strong>Anti-recommendation（何時不該用 federation）</strong>:高頻、重複、可容忍近即時延遲的分析、用 change stream 把資料落地 BigQuery 更划算;federation 的適用範圍是低頻、ad-hoc、需要活資料的查詢。把高頻分析硬塞 federation 是用錯整合路線。</p>
<h2 id="容量與觀測oltp-cpu-隔離與-federation-拉取成本">容量與觀測：OLTP CPU 隔離與 federation 拉取成本</h2>
<p>federation 的容量壓力分兩端 — Spanner 側看「分析查詢有沒有被 Data Boost 隔離開」、BigQuery 側看「federated query 的拉取量與成本」。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">Spanner OLTP CPU during analytics   → Data Boost 隔離是否生效的關鍵指標
</span></span><span class="line"><span class="ln">2</span><span class="cl">Spanner read capacity used by 分析   → 未隔離的 federated query 會吃這部分
</span></span><span class="line"><span class="ln">3</span><span class="cl">BigQuery federated query bytes 處理量 → federation 拉取成本的計費基礎
</span></span><span class="line"><span class="ln">4</span><span class="cl">分析查詢 latency vs OLTP p99 抖動相關性 → 隔離失效會讓兩者正相關</span></span></code></pre></div><p>核心容量判讀是「分析查詢執行期間、OLTP CPU 與 p99 是否穩定」 — 若穩定、Data Boost 隔離生效;若兩者正相關、隔離失效、分析查詢正在消耗本該服務 OLTP 的資源。用 <a href="/blog/backend/04-observability/observability-evidence-package/" data-link-title="4.20 Observability Evidence Package" data-link-desc="把 log、metric、trace、audit 與資料品質限制包成可交接證據">4.20 Observability Evidence Package</a> 把「分析查詢時段」跟「OLTP p99」配成 evidence pair。容量規劃上、若走 federation + Data Boost、OLTP sizing 不需為分析加碼（Data Boost 用獨立 compute）;若 federated query 未隔離、OLTP sizing 要把分析尖峰算進去、回 <a href="/blog/backend/09-performance-capacity/capacity-planning/" data-link-title="9.6 容量規劃模型" data-link-desc="peak forecast、headroom budget、growth curve、autoscaling sizing">9.6 容量規劃模型</a>。</p>
<blockquote>
<p><strong>Scope warning</strong>：Data Boost 的計費單位、federated query 的 bytes 計費、隔離的資源邊界屬 GCP 規格、隨版本演進、cross-verify 官方文件、非 9.C10 case 揭露的 production 數字。</p></blockquote>
<h2 id="邊界與整合何時把分析-workload-完全分出去">邊界與整合：何時把分析 workload 完全分出去</h2>
<h3 id="何時用-federation--data-boost">何時用 federation + Data Boost</h3>
<p>分析需要 Spanner 的活資料、查詢低頻或 ad-hoc、不想維護資料同步管線 — 這是 federation 的適用條件。Data Boost 讓它不干擾 OLTP、按需計費。即時營運 dashboard、臨時資料探索、不需要常駐 BigQuery 的分析都適合。</p>
<h3 id="何時把分析完全分到-bigquerychange-stream-落地">何時把分析完全分到 BigQuery（change stream 落地）</h3>
<p>分析是高頻、重複、需要 BigQuery 原生欄式效能、或需要在 BigQuery 累積跨年歷史 — 把資料用 change stream 持續同步到 BigQuery 落地、分析直接查 BigQuery、不再回 Spanner。判準是:當分析 workload 穩定且高頻、落地的一次性同步成本會被「不再每次 federated 拉取」攤平。這是「分析 workload 完全分出去」的訊號 — OLTP 與 OLAP 不只查詢入口分開、連儲存都分開。</p>
<h3 id="何時都不需要分析量小">何時都不需要（分析量小）</h3>
<p>若分析需求很小、Spanner 本身的 read capacity 有餘、偶爾在低峰跑個聚合不影響交易 — 不需要引入 federation 的額外設定。Anti-recommendation 的判準是:federation / Data Boost 的價值隨「分析與交易互相干擾的程度」上升;若兩者本來就不打架、保持簡單。</p>
<h3 id="sibling-deep-articles-路由">Sibling deep articles 路由</h3>
<ul>
<li><a href="../change-streams-cdc/">change-streams-cdc</a>：federation 的互補路線、高頻分析用 change stream 把資料落地 BigQuery、跟 federation 的「需要時去查」是兩種整合取捨</li>
<li><a href="../consistency-models-comparison/">consistency-models-comparison</a>：federated query 的快照一致性鬆於 OLTP transaction 的 external consistency、對帳場景的差異對應該文的一致性等級定義</li>
<li><a href="../truetime-api-depth/">truetime-api-depth</a>：需要嚴格時間點的分析要用 read-only transaction 配 timestamp bound、回該文的 staleness 選項</li>
</ul>
<h3 id="跟-knowledge-card-的互引">跟 knowledge card 的互引</h3>
<ul>
<li><a href="/blog/backend/knowledge-cards/federation/" data-link-title="Federation" data-link-desc="跨系統信任與授權交換的聯邦機制">federation</a> — 本文是這張卡在 Spanner ↔ BigQuery 的具體應用</li>
<li><a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed-sql</a> — Spanner 作為 OLTP distributed SQL、跟 BigQuery 的 OLAP 分工</li>
</ul>
<h3 id="跟其他章節的對照路由">跟其他章節的對照路由</h3>
<ul>
<li><a href="/blog/backend/09-performance-capacity/capacity-planning/" data-link-title="9.6 容量規劃模型" data-link-desc="peak forecast、headroom budget、growth curve、autoscaling sizing">9.6 容量規劃模型</a>：OLTP / OLAP 分工後各自的 sizing 不同、Data Boost 讓分析 sizing 跟 OLTP 解耦</li>
<li><a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a>：Spanner 定位在 OLTP、analytics 分到 BigQuery 是清楚的責任邊界</li>
</ul>
]]></content:encoded></item><item><title>MySQL HeatWave OLAP Add-on</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/mysql/heatwave-olap-addon/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/mysql/heatwave-olap-addon/</guid><description>&lt;p>MySQL HeatWave OLAP add-on 的核心責任是判斷 OLTP database 內建 analytics 加速何時比拆出 OLAP 系統更划算。HeatWave 這類 add-on 的價值是降低資料搬運與平台數量，但它也把 analytics workload、成本、freshness 與 query governance 帶回 MySQL 生態。&lt;/p>
&lt;p>本文的判讀錨點是：OLAP add-on 做的是把分析查詢從 OLTP 路徑&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/olap-offload/" data-link-title="OLAP Offload" data-link-desc="說明如何把分析型查詢從 OLTP 主庫卸載，以保護線上交易效能">卸載&lt;/a>到專用引擎，解決特定 analytics workload 的 proximity 問題，而非 data warehouse 的完整替代。選型要看資料量、query pattern、freshness、concurrency、成本與團隊能力。&lt;/p>
&lt;p>官方文件路由的核心責任是固定 HeatWave claim。實作前先查 &lt;a href="https://dev.mysql.com/doc/heatwave/en/index.html">MySQL HeatWave User Guide&lt;/a>；本文最後檢查日是 2026-05-22。&lt;/p>
&lt;h2 id="workload-fit">Workload Fit&lt;/h2>
&lt;p>Workload fit 的核心責任是找出 HeatWave 類 OLAP add-on 的合理位置。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>情境&lt;/th>
 &lt;th>適合原因&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>MySQL 資料為主要分析來源&lt;/td>
 &lt;td>減少 ETL / CDC 複雜度&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Dashboard 需要較新資料&lt;/td>
 &lt;td>freshness 比 warehouse batch 更重要&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>分析 query 可被明確界定&lt;/td>
 &lt;td>可控 workload 便於成本與容量管理&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Team 想降低平台數&lt;/td>
 &lt;td>MySQL 生態內完成 transactional + analytics&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>適合的 workload 通常是「MySQL 內資料、分析需求清楚、資料量可控」。若需要跨多資料源、複雜 semantic layer、長期資料湖與 ML feature store，warehouse / lakehouse 仍然更合適。&lt;/p>
&lt;h2 id="boundary-with-oltp">Boundary with OLTP&lt;/h2>
&lt;p>Boundary with OLTP 的核心責任是避免 analytics 壓力影響交易服務。OLTP query 要穩定、低延遲、可預測；OLAP query 常是大掃描、大聚合、長時間。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>審查面&lt;/th>
 &lt;th>問題&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Resource&lt;/td>
 &lt;td>OLAP 是否隔離 CPU / memory / storage&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Freshness&lt;/td>
 &lt;td>analytic data 和 source 差多久&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Query control&lt;/td>
 &lt;td>誰能跑 heavy query、如何限流&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cost&lt;/td>
 &lt;td>add-on node、storage、egress&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Incident&lt;/td>
 &lt;td>OLAP 故障是否影響 OLTP&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>OLAP add-on 要有 query admission policy。任何人都能跑任意分析 SQL，會把成本與穩定性風險放大。&lt;/p>
&lt;h2 id="freshness-and-evidence">Freshness and Evidence&lt;/h2>
&lt;p>Freshness and evidence 的核心責任是定義分析結果多新。Dashboard、營運報表、風控、推薦特徵對 freshness 的要求不同。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Freshness 等級&lt;/th>
 &lt;th>適合情境&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>秒到分鐘&lt;/td>
 &lt;td>operational dashboard、風控&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>小時&lt;/td>
 &lt;td>商業報表、營運分析&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>天&lt;/td>
 &lt;td>財務結算、長期趨勢&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Freshness 要被量測。Runbook 要記錄 last load / sync time、query latency、failed refresh、data gap 與 fallback dashboard。&lt;/p>
&lt;h2 id="cost-model">Cost Model&lt;/h2>
&lt;p>Cost model 的核心責任是比較 add-on 和獨立 OLAP 系統。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>成本項&lt;/th>
 &lt;th>HeatWave 類 add-on&lt;/th>
 &lt;th>獨立 warehouse&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Data movement&lt;/td>
 &lt;td>較少 ETL&lt;/td>
 &lt;td>需要 CDC / batch pipeline&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Compute&lt;/td>
 &lt;td>add-on capacity&lt;/td>
 &lt;td>warehouse compute / auto scaling&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Storage&lt;/td>
 &lt;td>MySQL ecosystem 內&lt;/td>
 &lt;td>separate storage&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Governance&lt;/td>
 &lt;td>MySQL 權限延伸&lt;/td>
 &lt;td>data platform governance&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lock-in&lt;/td>
 &lt;td>provider-specific&lt;/td>
 &lt;td>warehouse-specific&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>成本比較要包含人力。少一條 ETL pipeline 可能節省大量維運；但 provider-specific query 與管理模型也會增加 exit cost。&lt;/p></description><content:encoded><![CDATA[<p>MySQL HeatWave OLAP add-on 的核心責任是判斷 OLTP database 內建 analytics 加速何時比拆出 OLAP 系統更划算。HeatWave 這類 add-on 的價值是降低資料搬運與平台數量，但它也把 analytics workload、成本、freshness 與 query governance 帶回 MySQL 生態。</p>
<p>本文的判讀錨點是：OLAP add-on 做的是把分析查詢從 OLTP 路徑<a href="/blog/backend/knowledge-cards/olap-offload/" data-link-title="OLAP Offload" data-link-desc="說明如何把分析型查詢從 OLTP 主庫卸載，以保護線上交易效能">卸載</a>到專用引擎，解決特定 analytics workload 的 proximity 問題，而非 data warehouse 的完整替代。選型要看資料量、query pattern、freshness、concurrency、成本與團隊能力。</p>
<p>官方文件路由的核心責任是固定 HeatWave claim。實作前先查 <a href="https://dev.mysql.com/doc/heatwave/en/index.html">MySQL HeatWave User Guide</a>；本文最後檢查日是 2026-05-22。</p>
<h2 id="workload-fit">Workload Fit</h2>
<p>Workload fit 的核心責任是找出 HeatWave 類 OLAP add-on 的合理位置。</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>適合原因</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>MySQL 資料為主要分析來源</td>
          <td>減少 ETL / CDC 複雜度</td>
      </tr>
      <tr>
          <td>Dashboard 需要較新資料</td>
          <td>freshness 比 warehouse batch 更重要</td>
      </tr>
      <tr>
          <td>分析 query 可被明確界定</td>
          <td>可控 workload 便於成本與容量管理</td>
      </tr>
      <tr>
          <td>Team 想降低平台數</td>
          <td>MySQL 生態內完成 transactional + analytics</td>
      </tr>
  </tbody>
</table>
<p>適合的 workload 通常是「MySQL 內資料、分析需求清楚、資料量可控」。若需要跨多資料源、複雜 semantic layer、長期資料湖與 ML feature store，warehouse / lakehouse 仍然更合適。</p>
<h2 id="boundary-with-oltp">Boundary with OLTP</h2>
<p>Boundary with OLTP 的核心責任是避免 analytics 壓力影響交易服務。OLTP query 要穩定、低延遲、可預測；OLAP query 常是大掃描、大聚合、長時間。</p>
<table>
  <thead>
      <tr>
          <th>審查面</th>
          <th>問題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Resource</td>
          <td>OLAP 是否隔離 CPU / memory / storage</td>
      </tr>
      <tr>
          <td>Freshness</td>
          <td>analytic data 和 source 差多久</td>
      </tr>
      <tr>
          <td>Query control</td>
          <td>誰能跑 heavy query、如何限流</td>
      </tr>
      <tr>
          <td>Cost</td>
          <td>add-on node、storage、egress</td>
      </tr>
      <tr>
          <td>Incident</td>
          <td>OLAP 故障是否影響 OLTP</td>
      </tr>
  </tbody>
</table>
<p>OLAP add-on 要有 query admission policy。任何人都能跑任意分析 SQL，會把成本與穩定性風險放大。</p>
<h2 id="freshness-and-evidence">Freshness and Evidence</h2>
<p>Freshness and evidence 的核心責任是定義分析結果多新。Dashboard、營運報表、風控、推薦特徵對 freshness 的要求不同。</p>
<table>
  <thead>
      <tr>
          <th>Freshness 等級</th>
          <th>適合情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>秒到分鐘</td>
          <td>operational dashboard、風控</td>
      </tr>
      <tr>
          <td>小時</td>
          <td>商業報表、營運分析</td>
      </tr>
      <tr>
          <td>天</td>
          <td>財務結算、長期趨勢</td>
      </tr>
  </tbody>
</table>
<p>Freshness 要被量測。Runbook 要記錄 last load / sync time、query latency、failed refresh、data gap 與 fallback dashboard。</p>
<h2 id="cost-model">Cost Model</h2>
<p>Cost model 的核心責任是比較 add-on 和獨立 OLAP 系統。</p>
<table>
  <thead>
      <tr>
          <th>成本項</th>
          <th>HeatWave 類 add-on</th>
          <th>獨立 warehouse</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Data movement</td>
          <td>較少 ETL</td>
          <td>需要 CDC / batch pipeline</td>
      </tr>
      <tr>
          <td>Compute</td>
          <td>add-on capacity</td>
          <td>warehouse compute / auto scaling</td>
      </tr>
      <tr>
          <td>Storage</td>
          <td>MySQL ecosystem 內</td>
          <td>separate storage</td>
      </tr>
      <tr>
          <td>Governance</td>
          <td>MySQL 權限延伸</td>
          <td>data platform governance</td>
      </tr>
      <tr>
          <td>Lock-in</td>
          <td>provider-specific</td>
          <td>warehouse-specific</td>
      </tr>
  </tbody>
</table>
<p>成本比較要包含人力。少一條 ETL pipeline 可能節省大量維運；但 provider-specific query 與管理模型也會增加 exit cost。</p>
<h2 id="no-go-conditions">No-Go Conditions</h2>
<p>No-go conditions 的核心責任是避免把 OLAP add-on 推到資料平台的位置。</p>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>建議路由</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>分析跨多來源</td>
          <td>warehouse / lakehouse</td>
      </tr>
      <tr>
          <td>查詢需要 semantic layer / BI governance</td>
          <td>dedicated analytics platform</td>
      </tr>
      <tr>
          <td>長期歷史資料遠大於 OLTP</td>
          <td>warehouse / object storage</td>
      </tr>
      <tr>
          <td>ML feature / offline training</td>
          <td>feature store / lakehouse</td>
      </tr>
      <tr>
          <td>成本需要獨立 chargeback</td>
          <td>separate OLAP environment</td>
      </tr>
  </tbody>
</table>
<p>HeatWave 類能力適合 MySQL-centered analytics。當分析需求超出單一 OLTP source，資料平台會比 add-on 更清楚。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>HeatWave OLAP add-on 完成後，MySQL query 基礎讀 <a href="../query-optimization/">Query Optimization</a>；資料平台邊界讀 backend analytics / warehouse 章節；若要保留 MySQL OLTP 並外接 CDC，讀 <a href="../binlog-cdc/">Binlog CDC</a>。</p>
]]></content:encoded></item></channel></rss>