重新整理具體化視觀表 - Amazon Redshift

自 2025 年 11 月 1 日起,Amazon Redshift 將不再支援建立新的 Python UDFs。如果您想要使用 Python UDFs,請在該日期之前建立 UDFs。現有的 Python UDFs將繼續如常運作。如需詳細資訊,請參閱部落格文章

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

重新整理具體化視觀表

本主題說明如何從基礎資料表重新整理材料檢視中的資料。

當您建立具體化視觀表時,其內容會反映當時基礎資料庫關係 (資料表或其他具體化視觀表) 的狀態。即使應用程式變更基底資料表中的資料,具體化視觀表中的資料仍會維持不變。若更新具體化視觀表中的資料,您可以隨時使用 REFRESH MATERIALIZED VIEW 陳述式來手動重新整理具體化視觀表。當您使用此陳述式時,Amazon Redshift 會識別在基本關係中發生的變更,並將這些變更套用至具體化視觀表。

Amazon Redshift 有兩種策略可重新整理具體化視觀表:

  • 在許多案例中,Amazon Redshift 可以執行累加式重新整理。在增量重新整理中,Amazon Redshift 會快速識別自上次重新整理後基礎關係中資料的變更,並更新具體化檢視中的資料。定義具體化視觀表時,在查詢中使用的下列 SQL 建構模組上,可支援累加式重新整理。

    • 包含 SELECT、FROM、[INNER] JOIN、WHERE、GROUP BY、HAVING 子句的建構模組。

    • 包含彙總的建構模組,如 SUM、MIN、MAX、AVG 和 COUNT。

    • 大部分的內建 SQL 函數 (特別是不可變的 SQL 函數) 有鑑於此,都會給與相同的輸入引數並始終產生相同的輸出。

    以資料共用資料表為基礎的具體化視觀表也支援累加式重新整理。

  • 如果無法進行累加式更新,則 Amazon Redshift 會執行完全的重新整理。「完全重新整理」會重新執行基礎 SQL 陳述式,替換具體化視觀表中的所有資料。

  • Amazon Redshift 會根據用來定義具體化視觀表的 SELECT 查詢,自動選擇具體化視觀表的重新整理方法。

巢狀具體化視觀表

具體化視觀表 (可在其他具體化視觀表上定義)。若要重新整理此類具體化視觀表,您必須明確使用最上層具體化視觀表重新整理的CASCADE關鍵字。例如,假設下列巢狀具體化視觀表結構:

CREATE TABLE t(a INT); CREATE MATERIALIZED VIEW u AS SELECT * FROM t; CREATE MATERIALIZED VIEW v AS SELECT * FROM u; CREATE MATERIALIZED VIEW w AS SELECT * FROM v; -- w -> v -> u -> t INSERT INTO t VALUES (1);

若要讓 完整更新,您有兩個選擇:

  • (建議) 使用 REFRESH MATERIALIZED VIEW w CASCADE命令重新整理 w。此命令會在單一交易中重新整理所有具體化視觀表。

  • 依相依性順序 (第一個 u,然後 v,然後 w),將 u、v 和 w 重新整理為不同的命令。

如果未明確使用CASCADE關鍵字,具體化視觀表會在RESTRICT模式下重新整理,僅重新整理目前具體化視觀表。下列範例顯示當您在具體化視觀表REFRESH MATERIALIZED VIEW上執行 時的資訊性訊息,視out-of-date的具體化視觀表而定。

REFRESH MATERIALIZED VIEW w; INFO: Materialized view w is already up to date. However, it depends on another materialized view that is not up to date. REFRESH MATERIALIZED VIEW w CASCADE; INFO: Materialized view w was incrementally updated successfully.
REFRESH MATERIALIZED VIEW v; INFO: Materialized view v is already up to date. However, it depends on another materialized view that is not up to date. REFRESH MATERIALIZED VIEW v CASCADE; INFO: Materialized view v was incrementally updated successfully.

在上述使用層疊重新整理選項的範例中,會先重新整理具體化視觀表 u,接著重新整理具體化視觀表 v,而且不會重新整理具體化視觀表 w。

以下範例顯示如何以程式設計方式,為具體化視觀表建立完整重新整理計劃。若要重新整理具體化視觀表 v,請先重新整理具體化視觀表 u 若要重新整理具體化視觀表 v,請先重新整理具體化視觀表 u,然後再重新整理具體化視觀表 v。

WITH RECURSIVE recursive_deps (mv_tgt, lvl, mv_dep) AS ( SELECT trim(name) as mv_tgt, 0 as lvl, trim(ref_name) as mv_dep FROM stv_mv_deps UNION ALL SELECT R.mv_tgt, R.lvl+1 as lvl, trim(S.ref_name) as mv_dep FROM stv_mv_deps S, recursive_deps R WHERE R.mv_dep = S.name ) SELECT mv_tgt, mv_dep from recursive_deps ORDER BY mv_tgt, lvl DESC; mv_tgt | mv_dep --------+-------- v | u w | u w | v (3 rows)

限制

Amazon Redshift 不支援基於以下來源的具體化視觀表的層疊重新整理:

  • 本機資料表

  • 本機 MVs

  • 串流 MVs

對於使用下列 SQL 元素搭配查詢定義的具體化視觀表,Amazon Redshift 不支援累加式重新整理:

  • OUTER JOIN (RIGHT、LEFT 或 FULL)。

  • 集合操作 UNION、INTERSECT、EXCEPT 和 MINUS。

  • 彙整函數 MEDIAN、PERCENTILE_CONT、LISTAGG、STDDEV_SAMP、STDDEV_POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 及位元彙整函數。

    注意

    支援 COUNT、SUM 和 AVG 彙總函數。

  • DISTINCT 彙整函數,例如 DISTINCT COUNT、DISTINCT SUM 等。

  • 視窗函數。

  • 使用暫存資料表進行查詢最佳化的查詢,例如最佳化通用子運算式。

  • 子查詢。

  • 在定義具體化視觀表的查詢中,參照下列查詢中的格式的外部資料表。

    • Delta Lake

    • Hudi

    使用上述格式以外的格式定義的具體化視觀表支援增量重新整理。如需詳細資訊,請參閱Amazon Redshift Spectrum 中外部資料湖資料表的具體化視觀表

自動重新整理具體化視觀表

建立或修改具體化視觀表以具有自動重新整理選項時,Amazon Redshift 可以使用其基礎資料表中的最新資料自動重新整理具體化視觀表。Amazon Redshift 會在基本資料表變更後盡快自動重新整理具體化視觀表。

為了在盡量不影響叢集內作用中工作負載的情況下完成重新整理最重要的具體化視觀表,Amazon Redshift 會考慮多個因素。這些因素包括目前的系統負載、重新整理所需的資源、可用的叢集資源,以及使用具體化視觀表的頻率。

Amazon Redshift 會優先考慮您的工作負載而非自動重新整理,並且可以停止自動重新整理以保留使用者工作負載的效能。此方法可能會延遲重新整理部分具體化視觀表。在某些情況下,您的具體化視觀表可能需要更具決定性的重新整理行為。如果是這樣,請考慮使用手動重新整理,如 REFRESH MATERIALIZED VIEW 所述,或透過 Amazon Redshift 排程器 API 操作或主控台來使用排程重新整理。

您可以使用 CREATE MATERIALIZED VIEW 來設定具體化視觀表的自動重新整理。您也可以使用 AUTO REFRESH 子句自動重新整理具體化視觀表。如需建立具體化視觀表的相關資訊,請參閱 CREATE MATERIALIZED VIEW。您可以使用 ALTER MATERIALIZED VIEW 來開啟目前具體化視觀表的自動重新整理。

重新整理具體化視觀表時應考慮以下項目:

  • 即使您尚未啟用具體化視觀表的自動重新整理,您仍然可以使用 REFRESH MATERIALIZED VIEW 命令明確地重新整理具體化視觀表。

  • 資料共用資料表和 Iceberg 資料表上定義的具體化視觀表支援 Amazon Redshift。

  • 對於重新整理狀態,您可以檢查 SVL_MV_REFRESH_STATUS,該狀態會記錄使用者啟動或自動重新整理的查詢。

  • 若要在僅限重新計算的具體化視觀表上執行 REFRESH,請確定您擁有結構描述的 CREATE 許可。如需詳細資訊,請參閱GRANT