CREATE MATERIALIZED VIEW
Gäller för: Databricks SQL
En materialiserad vy är en vy where förberäknade resultat är tillgängliga för frågor och kan uppdateras för att återspegla ändringar i indata. Varje gång en materialiserad vy uppdateras beräknas frågeresultaten om för att återspegla ändringar i överordnade datamängder. Alla materialiserade views backas upp av en DLT-pipeline. Du kan refresh materialisera views manuellt eller schemalagt.
För att lära dig mer om hur du utför en manuell refresh, se REFRESH (MATERIALIZED VIEW eller STREAMING TABLE).
Mer information om hur du schemalägger en refreshfinns i Exempel eller ALTER MATERIALIZED VIEW.
Kommentar
Skapa och refresh operationer på materialiserade views och strömmande tables drivs av en serverlös Delta Live-Tables pipeline. Du kan använda Catalog Explorer för att visa information om de bakomliggande pipelines i användargränssnittet. Se Vad är Catalog Explorer?.
Syntax
{ 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
ERSÄTTA
Om det anges ersätter du vyn och dess innehåll om det redan finns.
OM INTE FINNS
Skapar vyn om den inte finns. Om det redan finns en vy med det här namnet ignoreras -instruktionen
CREATE MATERIALIZED VIEW
.Du kan ange högst en av
IF NOT EXISTS
ellerOR REPLACE
.-
Namnet på den nyligen skapade vyn. Det fullständigt kvalificerade vynamnet måste vara unikt.
column_list
Det är valfritt att etikettera columns i frågeresultatet för vyn. Om du anger en columnlist måste antalet column alias matcha antalet uttryck i frågan. Om ingen columnlist anges härleds alias från brödtexten i vyn.
-
De column namnen måste vara unika och mappas till frågans utdata columns.
column_type
Anger column:s datatyp. Alla datatyper som stöds av Azure Databricks stöds inte av materialiserade views.
column_comment
En valfri
STRING
-literal som beskriver column. Det här alternativet måste anges tillsammans medcolumn_type
. Om typ column inte har angetts hoppas kommentaren column över.column_constraint
Lägger till en informerande primärnyckel eller informerande främmande nyckel constraint till column i en materialiserad vy. Om den column typen inte har angetts hoppas columnconstraint över.
-
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Lägger till en column maskfunktion för att anonymisera känsliga data. Alla efterföljande frågor från den column tar emot resultatet av utvärderingen av den funktionen över column istället för det ursprungliga värdet av column. Detta kan vara användbart i detaljerade åtkomstkontrollsyften where funktionen kan kontrollera identitets- eller gruppmedlemskapen för den anropande användaren för att avgöra om värdet ska redigeras. Om column-typen inte har angetts hoppar man över column-masken.
-
table_constraint
Lägger till en informerande primärnyckel eller informerande främmande nyckel constraint till table i en materialiserad vy. Om den column typen inte har angetts hoppas tableconstraint över.
view_clauses
Du kan också ange partitionering, kommentarer, användardefinierade egenskaper och ett refresh schema för den nya materialiserade vyn. Varje undersats kan bara anges en gång.
-
En valfri list av columns av table att partitiontable av.
KOMMENTAR view_comment
En
STRING
-literal som beskriver table.-
Du kan också ange en eller flera användardefinierade egenskaper.
Använd den här inställningen om du vill ange Delta Live Tables runtime channel som används för att köra den här instruktionen. Set värdet på egenskapen
pipelines.channel
till"PREVIEW"
eller"CURRENT"
. Standardvärdet är"CURRENT"
. För mer information om Delta Live Tables kanaler, se Delta Live Tables runtime-kanaler. SCHEMA [ REFRESH ] schema_klausul
EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS }
Om du vill schemalägga en refresh som inträffar regelbundet, använder du syntaxen
EVERY
. OmEVERY
syntax anges, uppdateras den strömmande table eller materialiserade vy regelbundet vid det angivna intervallet baserat på det angivna värdet, till exempelHOUR
,HOURS
,DAY
,DAYS
,WEEK
ellerWEEKS
. Följande table visar godkända heltal values förnumber
.Time unit Heltalsvärde HOUR or HOURS
1 <= H <= 72 DAY or DAYS
1 <= D <= 31 WEEK or WEEKS
1 <= W <= 8 Kommentar
Singular- och pluralformerna i den inkluderade tidsenheten är semantiskt likvärdiga.
CRON cron_string [ AT TIME ZONE timezone_id ]
Så här schemalägger du en refresh med hjälp av ett kvarts cron- värde. Giltiga time_zone_values accepteras.
AT TIME ZONE LOCAL
stöds inte.Om
AT TIME ZONE
den saknas används tidszonen för sessionen. OmAT TIME ZONE
saknas och sessionens tidszon inte är setutlöses ett fel.SCHEDULE
är semantiskt likvärdigt medSCHEDULE REFRESH
.
WITH ROW FILTER-sats
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Lägger till en radfilterfunktion i table. Alla efterföljande frågor från table tar emot en delmängd av de rader som funktionen utvärderar till booleskt sant. Detta kan vara användbart för detaljerad åtkomstkontroll where funktionen kan inspektera identitets- eller gruppmedlemskap för den anropande användaren för att avgöra om vissa rader ska filtreras.
-
-
En sökfråga som konstruerar vyn från bas tables eller annat views.
Behörigheter som krävs
Användaren som skapar en materialiserad vy (MV) är MV-ägare och måste ha följande behörigheter:
-
SELECT
behörighet över den bas tables som refereras av MV. -
USE CATALOG
behörighet för den överordnade catalog ochUSE SCHEMA
behörigheten för den överordnade schema. -
CREATE MATERIALIZED VIEW
behörighet på schema för MV.
För att en användare ska kunna refresh MV kräver de:
-
USE CATALOG
behörighet för den överordnade catalog ochUSE SCHEMA
behörigheten för den överordnade schema. - Ägarskap för MV eller
REFRESH
behörighet på MV. - Ägaren av MV måste ha
SELECT
behörighet för den bas tables som refereras av MV.
För att en användare ska kunna köra frågor mot MV:en behöver de:
-
USE CATALOG
behörighet för den överordnade catalog ochUSE SCHEMA
behörigheten för den överordnade schema. -
SELECT
behörighet över den materialiserade vyn.
Radfilter och column-masker
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Med radfilter kan du ange en funktion som används som ett filter när en table genomsökning hämtar rader. Dessa filter säkerställer att efterföljande frågor endast returnerar rader som filterpredikatet utvärderas till sant för.
Column-masker gör att du kan maskera en column:s values när en table-skanning hämtar rader. Alla framtida frågeställningar som rör den column kommer att få resultatet av att funktionen utvärderats över column, och detta resultat ersätter column:s ursprungliga värde.
Mer information om hur du använder radfilter och column masker finns i Filtrera känsliga table data med hjälp av radfilter och column masker.
Hantera radfilter och Column maskar
Radfilter och column masker på materialiserade objekt views ska läggas till via CREATE
-instruktionen.
Funktionssätt
-
Refresh som Definer: När
REFRESH MATERIALIZED VIEW
-instruktionen uppdaterar en materialiserad vy körs radfilterfunktionerna med definierarens rättigheter (som table ägare). Det innebär att tablerefresh använder säkerhetskontexten för användaren som skapade den materialiserade vyn. -
Fråga: De flesta filter körs med definierarens rättigheter, men funktioner som kontrollerar användarkontexten (till exempel
CURRENT_USER
ochIS_MEMBER
) är undantag. Dessa funktioner körs som anropare. Den här metoden tillämpar användarspecifika datasäkerhets- och åtkomstkontroller baserat på den aktuella användarens kontext. - När du skapar materialiserad views över källa tables som innehåller radfilter och column-masker är refresh i den materialiserade vyn alltid en komplett refresh. En fullständig refresh ombearbetar alla tillgängliga data i källan med de senaste definitionerna. Detta säkerställer att säkerhetsprinciper på källan tables utvärderas och tillämpas med de mest up-todatumdata och definitioner.
Överskådlighet
Använd DESCRIBE EXTENDED
, INFORMATION_SCHEMA
eller Catalog Explorer för att undersöka befintliga radfilter och column masker som gäller för en viss materialiserad vy. Med den här funktionen kan användare utföra revision och granska dataåtkomst samt skyddsåtgärder för materialiserade views.
Begränsningar
- När en materialiserad vy med en
sum
aggregering över en NULL-kapabel column har det sista icke-NULL-värdet borttaget från den column – och därmed baraNULL
values finns kvar i den column – returnerar den materialiserade vyns resulterande aggregeringsvärde noll i stället förNULL
. -
Column-reference kräver inget alias. Referensuttryck som intecolumn kräver ett alias, som i följande exempel:
- Tillåten:
SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
- Tillåts inte:
SELECT col1, SUM(col2) FROM t GROUP BY col1
- Tillåten:
-
NOT NULL
måste anges manuellt tillsammans medPRIMARY KEY
för att vara en giltig instruktion. - Materialiserade views stöder inte identitets- columns- eller surrogatnycklar.
- Materialiserade views stöder inte kommandon för
OPTIMIZE
ochVACUUM
. Underhåll sker automatiskt. - Materialiserade views stöder inte förväntningar för att definiera begränsningar för datakvalitet.
Exempel
-- 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;