sql >> Database >  >> RDS >> Sqlserver

Is een view sneller dan een simpele query?

Ja , weergaven kunnen hebben een geclusterde index toegewezen en, als ze dat doen, slaan ze tijdelijke resultaten op die resulterende zoekopdrachten kunnen versnellen.

De eigen documentatie van Microsoft maakt heel duidelijk dat Views de prestaties kan verbeteren.

Ten eerste zijn de meeste weergaven die mensen maken eenvoudig weergaven en gebruiken deze functie niet, en verschillen daarom niet van het rechtstreeks opvragen van de basistabellen. Eenvoudige weergaven zijn uitgebreid en dragen dus niet direct bij aan prestatieverbeteringen - zoveel is waar. Echter, geïndexeerde weergaven kunnen dramatisch prestaties verbeteren.

Laat me direct naar de documentatie gaan:

Nadat een unieke geclusterde index voor de weergave is gemaakt, wordt de resultatenset van de weergave onmiddellijk gematerialiseerd en bewaard in fysieke opslag in de database, waardoor de overhead van het uitvoeren van deze kostbare bewerking tijdens de uitvoering wordt bespaard.

Ten tweede kunnen deze geïndexeerde weergaven werken zelfs als er niet direct naar wordt verwezen door een andere zoekopdracht omdat de optimizer ze indien nodig zal gebruiken in plaats van een tabelreferentie.

Nogmaals, de documentatie:

De geïndexeerde weergave kan op twee manieren worden gebruikt bij het uitvoeren van een query. De query kan rechtstreeks verwijzen naar de geïndexeerde weergave, of, wat nog belangrijker is, de query-optimizer kan de weergave selecteren als wordt bepaald dat de weergave kan worden vervangen door een deel van of alle query's in het goedkoopste queryplan. In het tweede geval wordt de geïndexeerde weergave gebruikt in plaats van de onderliggende tabellen en hun gewone indexen. Er hoeft niet naar de weergave te worden verwezen in de query voordat de query-optimizer deze kan gebruiken tijdens het uitvoeren van de query. Hierdoor kunnen bestaande applicaties profiteren van de nieuw gecreëerde geïndexeerde weergaven zonder die applicaties te wijzigen.

Deze documentatie, evenals grafieken die prestatieverbeteringen aantonen, zijn hier te vinden.

Update 2: het antwoord is bekritiseerd omdat het de "index" is die het prestatievoordeel biedt, niet de "View". Dit wordt echter gemakkelijk weerlegd.

Laten we zeggen dat we een softwarebedrijf zijn in een klein land; Ik zal Litouwen als voorbeeld nemen. We verkopen software wereldwijd en houden onze administratie bij in een SQL Server-database. We zijn erg succesvol en dus hebben we over een paar jaar meer dan 1.000.000 records. We moeten echter vaak verkopen rapporteren voor belastingdoeleinden en we ontdekken dat we in ons eigen land slechts 100 exemplaren van onze software hebben verkocht. Door een geïndexeerde weergave van alleen de Litouwse records te maken, kunnen we de records die we nodig hebben in een geïndexeerde cache bewaren, zoals beschreven in de MS-documentatie. Wanneer we onze rapporten voor Litouwse verkopen in 2008 uitvoeren, doorzoekt onze zoekopdracht een index met een diepte van slechts 7 (Log2(100) met enkele ongebruikte bladeren). Als we hetzelfde zouden doen zonder de VIEW en alleen zouden vertrouwen op een index in de tabel, zouden we een indexboom moeten doorkruisen met een zoekdiepte van 21!

Het is duidelijk dat de weergave zelf ons een prestatievoordeel (3x) zou opleveren ten opzichte van het eenvoudige gebruik van de index alleen. Ik heb geprobeerd een voorbeeld uit de praktijk te gebruiken, maar u zult zien dat een eenvoudige lijst met Litouwse verkopen ons een nog groter voordeel zou geven.

Merk op dat ik alleen een rechte b-tree gebruik voor mijn voorbeeld. Hoewel ik er vrij zeker van ben dat SQL Server een variant van een b-tree gebruikt, ken ik de details niet. Desalniettemin houdt het punt stand.

Update 3: De vraag is gerezen of een geïndexeerde weergave alleen een index gebruikt die op de onderliggende tabel is geplaatst. Dat wil zeggen, om te parafraseren:"een geïndexeerde weergave is gewoon het equivalent van een standaardindex en biedt niets nieuws of unieks aan een weergave." Als dit waar was, zou de bovenstaande analyse natuurlijk onjuist zijn! Laat me een citaat uit de Microsoft-documentatie geven om aan te tonen waarom ik denk dat deze kritiek niet geldig of waar is:

Het gebruik van indexen om de prestaties van query's te verbeteren is geen nieuw concept; geïndexeerde weergaven bieden echter extra prestatievoordelen die niet kunnen worden bereikt met standaardindexen.

Samen met het bovenstaande citaat met betrekking tot de persistentie van gegevens in fysieke opslag en andere informatie in de documentatie over hoe indexen worden gemaakt op Views, denk ik dat het veilig is om te zeggen dat een geïndexeerde weergave niet is alleen een in de cache opgeslagen SQL Select die toevallig een index gebruikt die in de hoofdtabel is gedefinieerd. Dus blijf ik bij dit antwoord.



  1. Het gelijktijdige verzoek afhandelen terwijl u in de Oracle-database blijft?

  2. De grootte van tabellen bepalen in Oracle

  3. Tutorial over SQL (DDL, DML) over het voorbeeld van MS SQL Server-dialect

  4. PG::ConnectionBad:fe_sendauth:geen wachtwoord opgegeven