Materializovaná zobrazení

Materializovaná zobrazení zpřístupňují agregační dotaz na zdrojovou tabulku nebo jiné materializované zobrazení.

Materializovaná zobrazení vždy vrací aktuální výsledek agregačního dotazu (vždy aktuální). Dotazování materializovaného zobrazení je výkonnější než spuštění agregace přímo nad zdrojovou tabulkou.

Poznámka

Proč používat materializovaná zobrazení?

Investicem prostředků (úložiště dat, cykly procesoru na pozadí) pro materializovaná zobrazení běžně používaných agregací získáte následující výhody:

  • Zvýšení výkonu: Dotazování materializovaného zobrazení obvykle funguje lépe než dotazování zdrojové tabulky na stejné agregační funkce.

  • Čerstvost: Dotaz materializovaného zobrazení vždy vrátí nejaktuálnější výsledky bez ohledu na to, kdy byla materializace naposledy proběhla. Dotaz kombinuje materializovanou část zobrazení se záznamy ve zdrojové tabulce, které ještě nebyly materializovány (část), delta a vždy poskytují nejaktuálnější výsledky.

  • Snížení nákladů:Dotazování materializovaného zobrazení spotřebovává méně prostředků z clusteru než agregace nad zdrojovou tabulkou. Zásady uchovávání informací pro zdrojovou tabulku je možné omezit, pokud je vyžadována pouze agregace. Toto nastavení snižuje náklady na horkou mezipaměť pro zdrojovou tabulku.

Příklady použití najdete v tématu Případy použití materializovaného zobrazení.

Jak materializovaná zobrazení fungují

Materializované zobrazení je tvořeno dvěma komponentami:

  • Materializovaná část – tabulka obsahující agregované záznamy ze zdrojové tabulky, které už byly zpracovány. Tato tabulka vždy obsahuje jeden záznam pro každou kombinaci agregace seskupování podle.
  • Delta – nově ingestované záznamy ve zdrojové tabulce, které ještě nebyly zpracovány.

Dotazování materializovaného zobrazení kombinuje materializovanou část s rozdílovou částí a poskytuje aktuální výsledek agregačního dotazu. Offline proces materializace ingestuje nové záznamy z rozdílové tabulky do materializované tabulky a nahradí existující záznamy. Nahrazení se provádí opětovným sestavením rozsahů, které obsahují záznamy, které se mají nahradit. Pokud se záznamy v delta neustále protínají se všemi datovými horizontálními oddíly v materializované části, každý cyklus materializace vyžaduje opětovné sestavení celé materializované části a nemusí držet krok s rychlostí příjmu dat. V takovém případě se zobrazení stane v pořádku a rozdíl se neustále zvětšuje. Stránka monitorování materializovaných zobrazení vysvětluje, jak takové situace řešit.

Dotazy materializovaných zobrazení

Existují 2 způsoby, jak dotazovat materializované zobrazení:

  • Dotazování na celé zobrazení: Když dotazujete materializované zobrazení podle jeho názvu, podobně jako dotazování tabulky, dotaz materializovaného zobrazení zkombinuje materializovanou část zobrazení se záznamy ve zdrojové tabulce, které ještě nebyly materializovány ().delta

    • Dotazování materializovaného zobrazení vždy vrátí nejaktuálnější výsledky na základě všech záznamů přijatých do zdrojové tabulky. Další informace o materializovaných a ne materializovaných částech v materializovaném zobrazení najdete v tématu o tom, jak materializovaná zobrazení fungují.
    • Tato možnost nemusí fungovat nejlépe, protože potřebuje materializovat delta část během doby dotazu. Výkon v tomto případě závisí na stáří zobrazení a filtrech použitých v dotazu. Část optimalizátoru dotazů materializovaného zobrazení obsahuje možné způsoby, jak zlepšit výkon dotazů při dotazování celého zobrazení.
  • Dotazování pouze na materializovanou část: dalším způsobem dotazování zobrazení je použití materialized_view() funkce. Tato možnost podporuje dotazování pouze na materializovanou část zobrazení a zároveň určuje maximální latenci, které je uživatel ochoten tolerovat.

    • Tato možnost nezaručuje, že vrátí nejaktuálnější záznamy, ale vždy by měla být výkonnější než dotazování celého zobrazení.
    • Tato funkce je užitečná ve scénářích, ve kterých jste ochotni obětovat určitou aktuálnost výkonu, například u řídicích panelů telemetrie.

Tip

Dotazy pouze na materializovanou část fungují vždy lépe než dotazy na celé zobrazení. Funkci vždy používejte, materialized_view() pokud je to možné pro váš případ použití.

  • Materializovaná zobrazení se účastní dotazů mezi clustery nebo mezi databázemi, ale nejsou součástí sjednocení se zástupnými značky ani hledání.

    • Všechny následující příklady zahrnují materializovaná zobrazení s názvem ViewName:
    cluster('cluster1').database('db').ViewName
    cluster('cluster1').database('*').ViewName
    database('*').ViewName
    database('DB*').ViewName
    database('*').materialized_view('ViewName')
    database('DB*').materialized_view('ViewName')
    
    • Následující příklady nezahrnují záznamy z materializovaných zobrazení:
    cluster('cluster1').database('db').*
    database('*').View*
    search in (*)
    search * 
    

Optimalizátor dotazů materializovaného zobrazení

Při dotazování na celé zobrazení se materializovaná část zkombinuje s časem delta dotazu. To zahrnuje agregaci delta a spojení s materializovanou částí.

  • Dotazování celého zobrazení funguje lépe, pokud dotaz obsahuje filtry pro seskupení podle klíčů materializovaného zobrazení. Další tipy k vytvoření materializovaného zobrazení na základě vzoru dotazu najdete v části Tipy pro zvýšení výkonu.create materialized-view.
  • Optimalizátor dotazů zvolí strategie souhrnu a spojení, u které se očekává zlepšení výkonu dotazů. Například rozhodnutí o tom, jestli se má dotaz prohazovat , vychází z částečně počtu záznamů delta . Následující vlastnosti požadavků klienta poskytují určitou kontrolu nad použitými optimalizacemi. Tyto vlastnosti můžete otestovat pomocí dotazů materializovaného zobrazení a vyhodnotit jejich dopad na výkon dotazů.
Název vlastnosti žádosti klienta Typ Description
materialized_view_query_optimization_costbased_enabled bool Pokud je tato možnost nastavená na false, zakáže optimalizaci souhrnu/spojení v dotazech materializovaného zobrazení. Používá výchozí strategie. Výchozí je true.
materialized_view_shuffle dynamic Vynuťte prohazování dotazu materializovaného zobrazení a (volitelně) zadejte konkrétní klíče pro náhodné prohazování. Podívejte se na příklady níže.

Příklady

  1. Zadejte dotaz na celé zobrazení. Nejnovější záznamy ve zdrojové tabulce jsou zahrnuty:

    ViewName
    
  2. Dotazujte pouze materializovanou část zobrazení bez ohledu na to, kdy byla naposledy materializována.

    materialized_view("ViewName")
    
  3. Zadejte dotaz na celé zobrazení a zadejte "nápovědu", jak použít shuffle strategii. Nejnovější záznamy ve zdrojové tabulce jsou zahrnuty:

    • Příklad č. 1: náhodné prohazení na Id základě sloupce (podobně jako při použití hint.shufflekey=Id):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName", "Keys" : [ "Id" ] }]);
    ViewName
    
    • Příklad č. 2: náhodné prohazení na základě všech klíčů (podobně jako při použití hint.strategy=shuffle):
    set materialized_view_shuffle = dynamic([{"Name" : "ViewName" }]);
    ViewName
    

Otázky výkonu

Hlavní přispěvatelé, kteří můžou ovlivnit stav materializovaného zobrazení, jsou:

  • Prostředky clusteru: Stejně jako jakýkoli jiný proces spuštěný v clusteru materializovaná zobrazení spotřebovávají prostředky (procesor, paměť) z clusteru. Pokud je cluster přetížený, přidání materializovaných zobrazení do něj může způsobit snížení výkonu clusteru. Monitorujte stav clusteru pomocí metrik stavu clusteru. Optimalizované automatické škálování v současné době v rámci pravidel automatického škálování nebere v úvahu stav materializovaných zobrazení.

  • Překrývání s materializovanými daty: Během materializace se všechny nové záznamy ingestované do zdrojové tabulky od poslední materializace (delta) zpracují a materializují do zobrazení. Čím vyšší je průsečík mezi novými a již materializovanými záznamy, tím horší bude výkon materializovaného zobrazení. Materializované zobrazení funguje nejlépe, pokud je počet aktualizovaných záznamů (například v arg_max zobrazení) malou podmnožinou zdrojové tabulky. Pokud je potřeba aktualizovat všechny nebo většinu materializovaných záznamů zobrazení v každém cyklu materializace, nemusí materializované zobrazení fungovat správně.

  • Rychlost příjmu dat: Ve zdrojové tabulce materializovaného zobrazení neexistují žádná pevně zakódovaná omezení objemu dat nebo rychlosti příjmu dat. Doporučená rychlost příjmu dat pro materializovaná zobrazení však není vyšší než 1–2 GB/s. Vyšší rychlost příjmu dat může stále fungovat dobře. Výkon závisí na velikosti clusteru, dostupných prostředcích a množství průniku s existujícími daty.

  • Počet materializovaných zobrazení v clusteru: Výše uvedené aspekty platí pro každé jednotlivé materializované zobrazení definované v clusteru. Každé zobrazení využívá své vlastní prostředky a mnoho zobrazení si navzájem konkuruje na dostupných prostředcích. I když neexistují pevně zakódovaná omezení počtu materializovaných zobrazení v clusteru, cluster nemusí být schopen zpracovat všechna materializovaná zobrazení, pokud existuje mnoho definovaných. Zásady kapacity je možné upravit, pokud je v clusteru více než jedno materializované zobrazení. Zvýšením hodnoty v zásadách ClusterMinimumConcurrentOperations současně spustíte více materializovaných zobrazení.

  • Definice materializovaného zobrazení: Definice materializovaného zobrazení musí být definována v souladu s osvědčenými postupy pro dotazy, aby byl nejlepší výkon dotazů. Další informace najdete v tématu vytváření tipů k výkonu příkazů.

Materializované zobrazení nad materializovaným zobrazením

Materializované zobrazení lze vytvořit v jiném materializovaném zobrazení, pokud je zdrojové materializované zobrazení zobrazení odstranění duplicitních dat. Konkrétně agregace zdrojového materializovaného zobrazení musí být take_any(*) za účelem odstranění duplicit zdrojových záznamů. Druhé materializované zobrazení může používat jakékoli podporované agregační funkce. Konkrétní informace o tom, jak vytvořit materializované zobrazení v materializovaném zobrazení, najdete v tématu .create materialized-view command.

Tip

Při dotazování materializovaného zobrazení, které je definováno v jiném materializovaném zobrazení, doporučujeme dotazovat materializovanou část pouze pomocí materialized_view() funkce. Dotazování celého zobrazení není výkonné, pokud nejsou plně materializovaná obě zobrazení. Další informace najdete v tématu dotazy materializovaných zobrazení.