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

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

重新整理具體化視觀表

當您建立具體化視觀表時,其內容會反映當時基礎資料庫資料表或資料表的狀態。即使應用程式變更基底資料表中的資料,具體化視觀表中的資料仍會維持不變。若更新具體化視觀表中的資料,您可以隨時使用 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 查詢,自動選擇具體化視觀表的重新整理方法。

重新整理具體化視觀表上的具體化視觀表並不是串聯處理。換句話說,假設您有一個依賴具體化視觀表 B 的具體化視觀表 A。在此情況下,當呼叫「重新整理具體化視觀表 A」時,會使用目前版本的 B 重新整理 A,即使 B 為也是如此 out-of-date。要使 A 完全保持最新狀態,請在重新整理 A 之前,先在單獨的交易中重新整理 B。

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

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; 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)

下列範例顯示當您在相依具體化視觀表的具體化視觀表上執行「重新整理具體化視 out-of-date 觀表」時的資訊訊息。

create table a(a int);
create materialized view b as select * from a;
create materialized view c as select * from b;
insert into a values (1);
refresh materialized view c; INFO: Materialized view c is already up to date. However, it depends on another materialized view that is not up to date.
REFRESH MATERIALIZED VIEW b; INFO: Materialized view b was incrementally updated successfully.
REFRESH MATERIALIZED VIEW c; INFO: Materialized view c was incrementally updated successfully.

Amazon Redshift 目前對於具體化視觀表的累加式重新整理有下列限制。

對於使用下列 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 管理指南中的建立預覽叢集。如需設定預覽工作群組的詳細資訊,請參閱 Amazon Redshift 管理指南中的建立預覽工作群組

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

使用建立或變更具體化視圖以使用自動重新整理選項時,Amazon Redshift 可以使用其基礎表格中的 up-to-date 資料自動重新整理具體化視觀表。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 命令明確地重新整理具體化視觀表。

  • Amazon Redshift 不會自動重新整理外部資料表上定義的具體化視觀表。

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

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