共用方式為


CREATE MATERIALIZED VIEW

適用於:核取記號為「是」 Databricks SQL

具體化檢視是一種檢視,其中預先計算的結果可供查詢使用,並可更新以反映輸入中的變更。 每次重新整理具體化檢視時,都會重新計算查詢結果,以反映上游資料集中的變更。 所有具體化檢視都由 DLT 管線支援。 可以手動或按排程重新整理具體化檢視。

若要深入了解如何執行手動重新整理,請參閱重新整理 (具體化檢視或串流資料表)

若要深入了解如何排程重新整理,請參閱範例改變具體化檢視

注意

具體化檢視和串流資料表的建立和重新整理操作由無伺服器 Delta Live Tables 管線所支援。 您可以使用目錄總管來檢視 UI 中備份管線的詳細資料。 請參閱什麼是目錄總管?

語法

{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] }
  view_name
  [ column_list ]
  [ view_clauses ]
  [schedule_clause]
  AS query

column_list
   ( { column_name column_type column_properties } [, ...]
      [ , table_constraint ] [...])

   column_properties
      { NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
  { PARTITIONED BY (col [, ...]) |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    SCHEDULE [ REFRESH ] schedule_clause |
    WITH { ROW FILTER clause } } [...]

schedule_clause
  { EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } |
    CRON cron_string [ AT TIME ZONE timezone_id ] }

參數

  • REPLACE

    如果已指定,則會取代檢視及其內容,如果已經存在的話。

  • IF NOT EXISTS

    如果不存在,則建立檢視。 如果此名稱的檢視已經存在,則會忽略 CREATE MATERIALIZED VIEW 陳述式。

    您最多可以指定 IF NOT EXISTSOR REPLACE 中的一個。

  • view_name

    新建立的檢視的名稱。 完整檢視名稱必須唯一。

  • column_list

    選擇性地在檢視的查詢結果中標記資料行。 如果您提供資料行清單,資料行別名的數目必須符合查詢中的運算式數目。 如果未指定任何資料行清單,別名會衍生自檢視本文。

    • column_name

      資料行名稱必須唯一,且對應至查詢的輸出資料行。

    • column_type

      指定資料行的資料類型。 具體化檢視並不支援 Azure Databricks 所支援的所有資料類型。

    • column_comment

      描述數據行的選擇性 STRING 常值。 此選項必須與 column_type 一起指定。 如果未指定資料行類型,則會略過資料行註解。

    • column_constraint

      將資訊主索引鍵或資訊外部索引鍵條件約束加入具體化檢視中的資料行。 如果未指定資料行類型,則會略過資料行條件約束。

    • MASK 子句

      重要

      這項功能處於公開預覽狀態

      新增資料行 mask 函式來匿名敏感性資料。 該資料行的所有後續查詢都會收到針對資料行中該函式的評估結果,而不是該資料行的原始值。 這適用於更細緻的存取控制,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以確定是否要修訂該值。 如果未指定資料行類型,則會略過資料行遮罩。

  • table_constraint

    將資訊主索引鍵或資訊外部索引鍵條件約束加入具體化檢視中的資料表。 如果未指定資料行類型,則會略過資料表條件約束。

  • view_clauses

    選擇性地指定新具體化檢視的資料分割、註解、使用者定義的屬性和重新整理排程。 每個次子句只能指定一次。

    • PARTITIONED BY

      資料表資料行的可選清單,據此分割資料表。

    • COMMENT view_comment

      用於描述資料表的 STRING 常值。

    • TBLPROPERTIES

      選擇性地設定一個或多個使用者定義的屬性。

      使用此設定來指定用來執行此語句的 Delta Live Tables 執行時間通道。 將屬性的值 pipelines.channel 設定為 "PREVIEW""CURRENT"。 預設值是 "CURRENT"。 如需 Delta Live Tables 通道的詳細資訊,請參閱 Delta Live Tables 運行時間通道

    • SCHEDULE [ REFRESH ] schedule_clause

      • EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS }

        重要

        這項功能處於公開預覽狀態

        若要排程定期發生的重新整理,請使用 EVERY 語法。 如果 EVERY 指定語法,則資料串流資料表或具體化檢視會根據所提供的值定期重新整理指定的間隔,例如 HOURHOURSDAYDAYSWEEKWEEKS。 下表列出 接受的 number整數值。

        Time unit 整數值
        HOUR or HOURS 1 <= H <= 72
        DAY or DAYS 1 <= D <= 31
        WEEK or WEEKS 1 <= W <= 8

        注意

        內含時間單位的單數和複數形式在語意上相等。

      • CRON cron_string [ AT TIME ZONE timezone_id ]

        使用晶體 cron 值來排程重新整理。 接受有效的 time_zone_values 。 不支援 AT TIME ZONE LOCAL

        如果 AT TIME ZONE 不存在,則會使用工作階段時區。 如果 AT TIME ZONE 不存在且未設定工作階段時區,則會擲回錯誤。 SCHEDULE 在語意上相當於 SCHEDULE REFRESH

    • WITH ROW FILTER 子句

      重要

      這項功能處於公開預覽狀態

      將資料列篩選函數新增至資料表。 該資料表的所有後續查詢都會接收函式評估為布爾 TRUE 的資料列子集。 這適用於更細緻的存取控制,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要篩選某些資料列。

  • AS 查詢

    從基底資料表或其他檢視中建構檢視的查詢。

所需的權限

建立具體化檢視 (MV) 的使用者是 MV 擁有者,且必須擁有下列權限:

  • MV 所參考之基底資料表的 SELECT 權限。
  • 父目錄的 USE CATALOG 權限,以及父結構描述的 USE SCHEMA 權限。
  • MV 的結構描述的 CREATE MATERIALIZED VIEW 權限。

使用者若要重新整理 MV,他們需要:

  • 父目錄的 USE CATALOG 權限,以及父結構描述的 USE SCHEMA 權限。
  • MV 的擁有權或對 MV 的 REFRESH 權限。
  • MV 的擁有者必須具有 MV 所參考之基底資料表 SELECT 權限。

使用者若要查詢 MV,他們需要:

  • 父目錄的 USE CATALOG 權限,以及父結構描述的 USE SCHEMA 權限。
  • 具體化檢視的 SELECT 權限。

資料列篩選器和資料行遮罩

重要

這項功能處於公開預覽狀態

每當資料表掃描擷取資料列時,資料列篩選可讓您指定套用為篩選條件的函式。 這些篩選條件可確保後續查詢只會傳回篩選條件述詞評估為 true 的資料列。

每當資料表掃描擷取資料列時,資料行遮罩可讓您遮罩資料行的值。 涉及該資料行的所有未來查詢都會收到針對資料行評估該函式的結果,而不是取代該資料行的原始值。

如需有關如何使用資料列篩選和資料行遮罩的詳細資訊,請參閱使用資料列篩選和資料行遮罩篩選敏感資料表資料

管理資料列篩選和資料行遮罩

具體化檢視上的資料列篩選和資料行遮罩應該透過 CREATE 陳述式進行新增。

行為

  • 以定義者身分重新整理:當 REFRESH MATERIALIZED VIEW 陳述式重新整理具體化檢視時,資料列篩選函式會以定義者的權限執行 (作為資料表擁有者)。 這表示資料表重新整理會使用建立具體化檢視之使用者的安全性內容。
  • 查詢:雖然大部分篩選都會以定義者的權限執行,但檢查使用者內容的函式 (例如 CURRENT_USERIS_MEMBER) 是例外狀況。 會以叫用者的身分執行這些函式。 此方法會根據目前使用者的內容強制執行使用者特定的資料安全性和存取控制。
  • 在包含資料列篩選和資料行遮罩的來源資料表上建立具體化檢視時,具體化檢視的重新整理始終是完全重新整理。 完全重新整理會使用最新的定義重新處理來源中所有可用的資料。 這可確保會使用最新的資料和定義來評估並套用來源資料表上的安全性原則。

可檢視性

使用 DESCRIBE EXTENDEDINFORMATION_SCHEMA 或目錄總管來檢查套用至指定具體化檢視的現有資料列篩選和資料行遮罩。 此功能可讓使用者稽核和檢閱具體化檢視的資料存取和保護措施。

限制

  • 當一個在 NULL 資料行上具有 sum 彙總的具體化檢視從該資料行中移除最後一個非 NULL 值時,只有 NULL 值保留在該資料行中,則具體化檢視結果彙總值傳回零,而不是 NULL
  • 資料行參考不需要別名。 非資料行參考運算式需要別名,如下列範例所示:
    • 允許:SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 不允許:SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 必須手動指定 NOT NULLPRIMARY KEY,才能成為有效的陳述式。
  • 具體化檢視不支援識別欄位或代理索引鍵。
  • 具體化檢視不支援 OPTIMIZEVACUUM 命令。 自動進行維護。
  • 具體化檢視不支援定義資料品質限制的預期。

範例

-- Create a materialized view if it doesn't exist
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create and schedule a materialized view to be refreshed daily at midnight.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE CRON '0 0 0 * * ? *'
  AS SELECT date AS date, sum(sales) AS sumOfSales
       FROM table1
       GROUP BY date;

-- Sets the runtime channel to "PREVIEW"
> CREATE MATERIALIZED VIEW mv_preview
  TBLPROPERTIES(pipelines.channel = "PREVIEW")
  AS SELECT * FROM RANGE(10)

-- Create a materialized view with a table constraint
> CREATE MATERIALIZED VIEW IF NOT EXISTS subscribed_movies(
    member_id int NOT NULL,
    full_name string,
    movie_title string,
    CONSTRAINT movie_pk PRIMARY KEY(member_id)
  )
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create or replace the materialized view to remove the table constraint and add a partition
> CREATE OR REPLACE MATERIALIZED VIEW subscribed_movies
  PARTITIONED BY (member_id)
  AS SELECT mo.member_id, mb.full_name, mo.movie_title
       FROM movies AS mo INNER JOIN members AS mb ON mo.member_id = mb.id;

-- Create a materialized view with a row filter and a column mask
> CREATE MATERIALIZED VIEW masked_view (
    id int,
    name string,
    region string,
    ssn string MASK catalog.schema.ssn_mask_fn
  )
  WITH ROW FILTER catalog.schema.us_filter_fn ON (region)
  AS SELECT id, name, region, ssn
       FROM employees;