sql >> Databáze >  >> RDS >> Sqlserver

Je zobrazení rychlejší než jednoduchý dotaz?

Ano , zobrazení může mají přiřazený seskupený index, a když tak učiní, uloží dočasné výsledky, které mohou urychlit výsledné dotazy.

Vlastní dokumentace společnosti Microsoft jasně ukazuje, že Views může zlepšit výkon.

Za prvé, většina zobrazení, která lidé vytvářejí, je jednoduchá zobrazení a tuto funkci nepoužívají, a proto se neliší od přímého dotazování na základní tabulky. Jednoduchá zobrazení jsou rozšířena na místě, a tak nepřispívají přímo ke zlepšení výkonu - tolik je pravda. Nicméně indexovaná zobrazení mohou dramaticky zlepšit výkon.

Dovolte mi přejít přímo k dokumentaci:

Po vytvoření jedinečného seskupeného indexu v pohledu se výsledná sada pohledu okamžitě zhmotní a uchová ve fyzickém úložišti v databázi, čímž se ušetří režie na provádění této nákladné operace při provádění.

Za druhé, tato indexovaná zobrazení mohou fungovat i když na ně přímo neodkazuje jiný dotaz protože je optimalizátor v případě potřeby použije místo odkazu na tabulku.

Opět dokumentace:

Indexované zobrazení lze při provádění dotazu použít dvěma způsoby. Dotaz může odkazovat přímo na indexované zobrazení nebo, což je důležitější, může optimalizátor dotazů vybrat zobrazení, pokud určí, že zobrazení lze nahradit některými nebo všemi dotazy v plánu dotazů s nejnižšími náklady. Ve druhém případě se místo podkladových tabulek a jejich běžných indexů použije indexované zobrazení. Na pohled není nutné odkazovat v dotazu, aby jej optimalizátor dotazů použil během provádění dotazu. To umožňuje stávajícím aplikacím těžit z nově vytvořených indexovaných zobrazení, aniž by se tyto aplikace měnily.

Tuto dokumentaci, stejně jako grafy demonstrující vylepšení výkonu, naleznete zde.

Aktualizace 2: odpověď byla kritizována na základě toho, že výkonnostní výhodu poskytuje „index“, nikoli „zobrazení“. To se však dá snadno vyvrátit.

Řekněme, že jsme softwarová společnost v malé zemi; Jako příklad použiji Litvu. Prodáváme software po celém světě a uchováváme naše záznamy v databázi SQL Server. Jsme velmi úspěšní, a tak za pár let máme přes 1 000 000 záznamů. Často však potřebujeme vykázat tržby pro daňové účely a zjistíme, že jsme v naší domovské zemi prodali pouze 100 kopií našeho softwaru. Vytvořením indexovaného zobrazení pouze litevských záznamů získáme potřebné záznamy v indexované mezipaměti, jak je popsáno v dokumentaci MS. Když spustíme naše přehledy pro litevské prodeje v roce 2008, náš dotaz prohledá index s hloubkou pouhých 7 (Log2(100) s některými nepoužitými listy). Pokud bychom měli udělat totéž bez VIEW a spoléhat se pouze na index do tabulky, museli bychom procházet indexový strom s hloubkou vyhledávání 21!

Je zřejmé, že samotný pohled by nám poskytl výkonnostní výhodu (3x) oproti jednoduchému použití samotného indexu. Pokusil jsem se použít příklad ze skutečného světa, ale všimnete si, že jednoduchý seznam litevských prodejů by nám dal ještě větší výhodu.

Všimněte si, že pro svůj příklad používám pouze přímý b-strom. I když jsem si docela jistý, že SQL Server používá nějakou variantu b-stromu, neznám podrobnosti. Nicméně pointa platí.

Aktualizace 3: Objevila se otázka, zda indexované zobrazení používá pouze index umístěný na podkladové tabulce. To znamená, abych parafrázoval:"indexovaný pohled je pouze ekvivalentem standardního indexu a nenabízí nic nového nebo jedinečného pro pohled." Pokud by to byla pravda, pak by výše uvedená analýza byla nesprávná! Dovolte mi poskytnout citaci z dokumentace společnosti Microsoft, která demonstruje, proč si myslím, že tato kritika není platná nebo pravdivá:

Použití indexů ke zlepšení výkonu dotazů není nový koncept; indexovaná zobrazení však poskytují další výkonnostní výhody, kterých nelze dosáhnout pomocí standardních indexů.

Spolu s výše uvedeným citátem týkajícím se přetrvávání dat ve fyzickém úložišti a dalšími informacemi v dokumentaci o tom, jak jsou indexy vytvářeny v zobrazeních, se domnívám, že lze s jistotou říci, že indexované zobrazení není pouze uložený SQL Select, který náhodou používá index definovaný v hlavní tabulce. Za touto odpovědí si tedy nadále stojím.



  1. Co je PostgreSQL?

  2. PostgreSQL:výchozí názvy omezení

  3. Zkontrolujte, kolik poštovních položek je ve frontě v databázové poště na serveru SQL (T-SQL)

  4. Jak zkontrolovat úroveň kompatibility databáze v SQL Server pomocí T-SQL