本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
重新整理具體化視觀表
本主題說明如何從基礎資料表重新整理材料檢視中的資料。
當您建立具體化視觀表時,其內容會反映當時基礎資料庫資料表或資料表的狀態。即使應用程式變更基底資料表中的資料,具體化視觀表中的資料仍會維持不變。若更新具體化視觀表中的資料,您可以隨時使用 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函數,特別是不可變的函數,因為這些函數具有相同的輸入引數,並且始終產生相同的輸出。
以資料共用資料表為基礎的具體化視觀表也支援累加式重新整理。
-
-
如果無法進行累加式更新,則 Amazon Redshift 會執行完全的重新整理。完整重新整理會重新執行基礎SQL陳述式,取代具體化檢視中的所有資料。
-
Amazon Redshift 會根據用於定義具體化視觀表的SELECT查詢,自動為具體化視觀表選擇重新整理方法。
重新整理具體化視觀表上的具體化視觀表並不是串聯處理。換句話說,假設您有一個具體化視觀表 A 取決於具體化視觀表 B。在此情況下,調用 REFRESH MATERIALIZED VIEW A 時,即使 B 是 ,也會使用目前版本的 B 重新整理 A 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)
當您REFRESHMATERIALIZEDVIEW在視具體化視觀表而定 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 目前對於具體化視觀表的累加式重新整理有下列限制。
Amazon Redshift 不支援使用下列SQL元素透過查詢定義的具體化檢視增量重新整理:
-
OUTER JOIN (RIGHT、 LEFT或 FULL)。
-
設定操作 UNION、INTERSECT、 EXCEPT和 MINUS。
-
彙總函數 MEDIAN、PERCENTILE_CONT、LISTAGG、STDDEV_SAMP、STDDEV_POP、APPROXIMATECOUNT、PERCENTILE、 APPROXIMATE 和 位元彙總函數。
注意
支援 COUNT、 SUM和 AVG彙總函數。
-
DISTINCT 彙總函數,例如 DISTINCT SUM、 COUNT DISTINCT 等。
視窗函數。
使用暫存資料表進行查詢最佳化的查詢,例如最佳化通用子運算式。
子查詢。
-
在定義具體化視觀表的查詢中,參照下列查詢中的格式的外部資料表。
-
Delta Lake
-
Hudi
對於使用上述格式以外的格式定義的具體化視觀表,預覽軌道上支援累加式重新整理。如需詳細資訊,請參閱 Amazon Redshift 管理指南中的建立預覽叢集。如需設定預覽工作群組的詳細資訊,請參閱 Amazon Redshift 管理指南中的建立預覽工作群組。
-
自動重新整理具體化視觀表
使用 up-to-date或 修改為具有自動重新整理選項時,Amazon Redshift 可以使用其基礎資料表中的資料自動重新整理具體化檢視。Amazon Redshift 會在基本資料表變更後盡快自動重新整理具體化視觀表。
為了在盡量不影響叢集內作用中工作負載的情況下完成重新整理最重要的具體化視觀表,Amazon Redshift 會考慮多個因素。這些因素包括目前的系統負載、重新整理所需的資源、可用的叢集資源,以及使用具體化視觀表的頻率。
Amazon Redshift 會優先考慮您的工作負載而非自動重新整理,並且可以停止自動重新整理以保留使用者工作負載的效能。此方法可能會延遲重新整理部分具體化視觀表。在某些情況下,您的具體化視觀表可能需要更具決定性的重新整理行為。若是如此,請考慮如 所述使用手動重新整理REFRESH MATERIALIZED VIEW,或使用 Amazon Redshift 排程器API操作或主控台進行排程重新整理。
您可以使用 CREATE MATERIALIZED 設定具體化檢視的自動重新整理VIEW。您也可以使用 AUTOREFRESH子句自動重新整理具體化檢視。如需建立具體化視觀表的相關資訊,請參閱 CREATE MATERIALIZED VIEW。您可以使用 ALTER MATERIALIZED VIEW 來開啟目前具體化視觀表的自動重新整理。
重新整理具體化視觀表時應考慮以下項目:
即使您尚未為具體化檢視啟用自動重新整理,您仍然可以使用REFRESHMATERIALIZEDVIEW命令明確重新整理具體化檢視。
Amazon Redshift 不會自動重新整理外部資料表上定義的具體化視觀表。
對於重新整理狀態,您可以檢查 SVL_MV_REFRESH_STATUS,其中會記錄使用者啟動或自動重新整理的查詢。
若要在重新運算限定具體化視觀表REFRESH上執行,請確定您有結構描述的CREATE許可。如需詳細資訊,請參閱GRANT。