共用方式為


CREATE MATERIALIZED VIEW

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

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

若要深入瞭解如何執行手動 refresh,請參閱 REFRESH (MATERIALIZED VIEW 或 STREAMING TABLE)

若要深入瞭解如何排程 refresh,請參閱 範例ALTER MATERIALIZED VIEW

注意

在具體化 views 和串流 tables 上建立和 refresh 作業是由無伺服器 Delta Live Tables 管線提供。 您可以使用 Catalog Explorer 來檢視 UI 中備份管線的詳細數據。 請參閱 什麼是 Catalog 瀏覽器?

語法

{ 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 ] }

Parameters

  • REPLACE

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

  • IF NOT EXISTS

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

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

  • view_name

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

  • column_list

    選擇性地在檢視的查詢結果中標記 columns。 如果您提供 columnlist,那麼 column 別名的數目必須與查詢中的表達式數目相符。 如果未指定任何 columnlist,則別名將從檢視的主體中衍生出來。

    • column_name

      column 名稱必須是唯一的,且對應至查詢的輸出 columns。

    • column_type

      指定 column的數據類型。 並非所有 Azure Databricks 支援的數據類型都受到具現化 views的支援。

    • column_comment

      描述 column的選擇性 STRING 字面值。 此選項必須與 column_type 一起指定。 如果未指定 column 類型,則會略過 column 批注。

    • column_constraint

      在具體化檢視中,將資訊主鍵或資訊外鍵 constraint 加入至 column。 如果未指定 column 類型,則會略過 columnconstraint。

    • MASK 子句

      重要

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

      新增 column 遮罩函式來匿名敏感數據。 所有來自該 column 的後續查詢將收到評估該函式的結果,該結果是以 column 替換 column的原始值後計算得出的。 對於細部訪問控制用途而言,這很實用,where 函式可以檢查叫用使用者的身分識別或群組成員資格,以判斷是否要修訂值。 如果未指定 column 類型,則會略過 column 遮罩。

  • table_constraint

    在具體化檢視中,將資訊性主鍵或資訊性外鍵 constraint 添加到 table。 如果未指定 column 類型,則會略過 tableconstraint。

  • view_clauses

    選擇性地指定新具現化檢視的分割區、註解、使用者定義屬性和 refresh 排程。 每個次子句只能指定一次。

    • PARTITIONED BY

      要 partitiontabletablecolumns 的選擇性 list。

    • COMMENT view_comment

      STRING 字面值來描述 table。

    • TBLPROPERTIES

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

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

    • SCHEDULE [ REFRESH ] schedule_clause

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

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

        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 值來排程 refresh。 接受有效的 time_zone_values 。 不支援 AT TIME ZONE LOCAL

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

    • ROW FILTER 子句

      重要

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

      將資料列篩選功能新增至 table。 該 table 的所有後續查詢都會接收到函式評估結果為布林 TRUE 的資料列子集。 對於細緻的訪問控制而言,where 函式檢查調用者的身分識別或群組成員資格,以判斷是否需要篩選特定資料列,這是非常有用的功能。

  • AS 查詢

    從基底 tables 或其他 views建構視圖的查詢。

所需的權限

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

  • SELECT 對 MV 所參考基底 tables 的許可權。
  • 父 catalog 的 USE CATALOG 許可權,以及父 schema的 USE SCHEMA 許可權。
  • 與MV相關的schema的CREATE MATERIALIZED VIEW許可權。

對於用戶能夠 refresh MV,他們需要:

  • 父 catalog 的 USE CATALOG 許可權,以及父 schema的 USE SCHEMA 許可權。
  • MV 的擁有權或對 MV 的 REFRESH 權限。
  • MV的擁有者必須對MV所參考的基底 tables 擁有 SELECT 許可權。

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

  • 父項 catalog 的 USE CATALOG 許可權,以及父項 schema的 USE SCHEMA 許可權。
  • 具體化檢視的 SELECT 權限。

資料列篩選和 column 遮罩

重要

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

每當 table 掃描擷取資料列時,資料列篩選讓您能夠指定一個函式作為過濾器來使用。 這些篩選條件可確保後續查詢只會傳回篩選條件述詞評估為 true 的資料列。

每當 table 掃描擷取數據列時,Column 遮罩可讓您遮罩 column的 values。 未來所有涉及該 column 的查詢都會接收到在 column上評估函式的結果,並取代 column的原始值。

如需瞭解如何使用數據列篩選器和 column 遮罩的更多資訊,請參閱 使用數據列篩選器和 column 遮罩篩選機密 table 數據

管理列篩選器和 Column 遮罩

資料列篩選器和 column 遮罩應該透過 CREATE 語句新增到具體化的 views 上。

行為

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

可檢視性

使用 DESCRIBE EXTENDEDINFORMATION_SCHEMA或 Catalog Explorer 來檢查應用於指定具體化檢視的現有列篩選器和 column 遮罩。 此功能可讓使用者稽核和檢閱具體化 views的數據存取和保護措施。

限制

  • 當一個具體化檢視對 NULL-able 的 column 執行 sum 匯總,且從該 column 移除了最後一個非 NULL 值後,該 column 中僅剩下 NULLvalues,這時具體化檢視的結果匯總值會回傳零,而不是 NULL
  • Column-reference 不需要別名。 非column 參考表示式需要別名,如下列範例所示:
    • 允許:SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 不允許:SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 必須手動指定 NOT NULLPRIMARY KEY,才能成為有效的陳述式。
  • 具體化 views 不支援身分識別 columns 或代理密鑰。
  • 具體化 views 不支援 OPTIMIZEVACUUM 命令。 自動進行維護。
  • 實體化的 views 不支援用於定義數據品質約束的功能。

範例

-- 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 every day.
-- Note: All columns in a GROUP BY need to be explicitly aliased
> CREATE MATERIALIZED VIEW daily_sales
  COMMENT 'Daily sales numbers'
  SCHEDULE EVERY 1 DAY
  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;