SQLShack (Norsk)

Dette er den fjerde artikkelen i en serie på å lære CREATE VIEW SQL-setningen. Så langt har vi gjort en god del for å opprette og endre visninger ved hjelp av T-SQL. I denne siste delen vil jeg ta en stor titt på hvordan du kan arbeide med indeksert utsikt.

Som alltid, å følge med serien, er det svært anbefales å lese de forrige delene først, og så dette., Dette er først og fremst fordi vi opprettet vår egen eksempeldatabasen og objekter i det fra scratch som vi skal bruke i denne delen også, men også fordi det vil være mye lettere å se det store bildet.

Her er de tidligere tre stykker av CREATE VIEW SQL-serien:

  • Opprette visninger i SQL Server
  • Endre visninger i SQL Server
  • å Sette inn data gjennom visninger i SQL Server

Så, hodet over, og les dem før du fortsetter med dette.

Innledning

Det første vi vil gjøre er å opprette en indeksert visning., Vi vil selvfølgelig bruke CREATE VIEW SQL-setningen for dette som vi gjorde mange ganger gjennom serien. Men den generelle ideen, som tittelen sier, er å se hvordan arbeidet med indeksert visninger, kan du se hva som kreves for å legge til en indeks til en visning, og hvordan du gjør det programmatisk. Videre, for å forklare fordeler av indeksert utsikt, vi skal se på henrettelser planer i SQL Server. De er et flott verktøy for DBAs og utviklere når det gjelder å finne og fikse en flaskehals i sakte kjører spørringen.,

Uten videre, la oss lage en vise med CREATE VIEW SQL-setningen fra nedenfor og se hva den gjør:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

BRUK SQLShackDB;
CREATE VIEW dbo.,vEmployeeSalesOrders
MED SCHEMABINDING
SOM
VELG Ansatte.Ansattid,
Produkter.ProductID,
SUM(pris * mengde) SOM SaleTotal,
SaleDate
FRA dbo.Ansatte
BLI med dbo.Salg PÅ Ansatte.Ansattid = Salg.Ansattid
BLI med dbo.Produkter som er PÅ Salg.ProductID = Produkter.ProductID
GRUPPE AV Ansatte.Ansattid,
Produkter.ProductID,
Salg.,SaleDate;

legg Merke til at dette synet har en MED SCHEMABINDING alternativ på det. Grunnen til at det har denne funksjonen slått på, er fordi når du oppretter indekser på utsikten, de faktisk fysisk blir lagret i databasen. Med andre ord, noe for at dette synet baserer seg på, så langt som tabellene er opptatt av, strukturen kan ikke endre fra det vi refererer til.

Derfor, det må være bundet til underliggende bord, slik at vi ikke kan endre dem på en måte som vil påvirke vise definisjonen., Hvis vi forsøker å endre dem på noen måte, SQL Server vil kaste en feil å si at dette synet kommer an på noe. Så, se på det som en vanskelig kravet for å opprette en indeks på et vis.

Når kommandoen er utført riktig, bør du se vEmployeeSalesOrders se under Utsikt mappe i Object Explorer som vist nedenfor:

definisjonen av visningen er litt mer komplisert spørsmål. Vi fikk et samlet i SELECT-setning etterfulgt av GRUPPEN AV klausulen., Husk, når vi har en samling i spørringen, det legger sammen tallene, så vi trenger å ha den GRUPPEN AV klausulen.

i Utgangspunktet, når det er en GRUPPE AV i en spørring, må vi gruppen av alt som er i select-listen, bortsett fra gruppen.,

Nå, jeg har allerede opprettet den vise, men husk at det er alltid en god idé å teste ut definisjon av visningen ved å kjøre bare VELGER en del av CREATE VIEW SQL-setningen for å se hva den returnerer:

du går på, her er hvordan du kan sjekke om Skjemaet er bundet alternativet er aktivert eller deaktivert., Head over til Objektet Explorer, utvide Utsikt, høyre-klikk på vis, og velg Egenskaper:

Blant alle andre opplysninger i Vis vinduet Egenskaper, vil du se hvis Skjemaet er bundet alternativet er satt til True eller False under General side.

Opprette indeksert utsikt

La oss gå videre og opprette en indeks på vårt vis., Consider the script from below for creating a clustered index on the vEmployeeSalesOrders view:

1
2
3
4
5
6

USE SQLShackDB;
GO
CREATE UNIQUE CLUSTERED INDEX CAK_vEmployeesSalesOrders
ON dbo.,vEmployeeSalesOrders(Ansattid, ProductID, SaleDate);

Hvis vi treffer på Utfør-knappen i SSMS, SQL Server vil kaste en feil å si at indeksen kan ikke opprettes:

Her er hele feilmeldingen som ikke kan bli sett i bildet over:

du kan Ikke opprette indeks på vis ‘SQLShackDB.dbo.vEmployeeSalesOrders » fordi det velger du listen inkluderer ikke en riktig bruk av COUNT_BIG. Vurdere å legge COUNT_BIG(*) for å velge listen.,

Vi trenger COUNT_BIG i dette tilfellet gitt det faktum at vi bruker GRUPPE AV i vårt syn.

generelt, hvis vi bruker gruppene som TELLER, SUM, AVG, etc. i indeksen er velger liste, vi må også inkludere COUNT_BIG for å opprette en indeks på det.

det er akkurat Det vi kommer til å gjøre.,ved hjelp av CREATE VIEW SQL-setningen og legge til COUNT_BIG til velg liste ved hjelp av skriptet nedenfor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

BRUK SQLShackDB;
ENDRE VISNING dbo.,vEmployeeSalesOrders
MED SCHEMABINDING
SOM
VELG Ansatte.Ansattid,
Produkter.ProductID,
SUM(pris * mengde) SOM SaleTotal,
SaleDate,
COUNT_BIG(*) SOM RecordCount
FRA dbo.Ansatte
BLI med dbo.Salg PÅ Ansatte.Ansattid = Salg.Ansattid
BLI med dbo.Produkter som er PÅ Salg.ProductID = Produkter.ProductID
GRUPPE AV Ansatte.Ansattid,
Produkter.ProductID,
Salg.,SaleDate;

Hvis du lurer på hvorfor dette skjer i dette tilfelle, er svaret: fordi SQL Server, trenger en måte for sporing antall record som vi snu for indeksen, og dette er også en av en hel haug av begrensningene med å skape indeksert utsikt.

Så langt, alt ser bra ut. Vi klarer endret definisjon av våre vise:

Nå, vi kan komme tilbake til å opprette en indeks på vis-ved å utføre den tidligere brukte skriptet en gang., Denne gangen, drift vil fullføre jevnt. Hvis vi går til Objektet Utforske og utvide Indekser mappe med vårt syn, vil vi se den nyopprettede index:

Fra her, hvis vi høyreklikk på indeksen, og velg properties (Egenskaper), under General side, kan du se vise navn, indeks navn, type, viktige søyler, etc.,:

Hvis vi bytter over til Lagring, vil du se at den har en Filegroup fordi det er fysisk lagret i en database:

Videre hvis vi bytter over til Fragmentering, det burde si at Totalt fragmentering er null prosent fordi vi har bare noen få poster i våre tabeller:

Leter du etter en detaljert, men morsomt og lett å lese primer på å opprettholde og overvåking SQL indekser? Sjekk ut SQL-indeksen vedlikehold.,

Sletting av indekser

Før vi går videre, la oss se hvordan vi kan slette en indeks. Den enkleste måten er å høyre-klikke på indeksen i Object Explorer og bruk Slett-alternativet. Men i tilfelle du trenger å slippe flere indekser på en gang, DROP INDEX uttalelsen kommer i hendig. Det er hva vi kommer til å gjøre, fordi det, tross alt, dette er en T-SQL-serien om å lære CREATE VIEW SQL-setningen.,

Use the script from below to drop the CAK_vEmployeesSalesOrders index:

1
2
3
4
5

USE SQLShackDB;
GO
DROP INDEX CAK_vEmployeesSalesOrders ON dbo.,vEmployeeSalesOrders;

Når du trenger å slippe flere indekser, bare oppgi alle navn, atskilt med et komma.

Genererer tilfeldige data

Nå, at vi ble kvitt indeksen, la oss generere noen tilfeldige data i bordet vårt, slik at vi kan se på gjennomføringsplan og se hvordan SQL Server henter data under panseret. Å analysere gjennomføringsplan vil vise forskjellen i hvordan resultatene påvirkes ved å kjøre spørringen med og uten en indeks på visning.,

Bruke skriptet fra under for å sette inn 50000 tilfeldig rekorder i Omsetning tabellen nedenfor:

jeg kommer ikke til å gå gjennom manuset i detaljer, men det er i utgangspunktet en løkke som vil utføre 50000 ganger og sett inn tilfeldig data i Salg bordet., for å sjekke om rekorder ble satt inn riktig, utfør følgende SELECT-setning som vil telle alle poster fra Salg tabellen:

1
2
3
4

BRUK SQLShackDB;
SELECT COUNT(*) FRA Salg

antall returnerte viser at det er 50006 rader i Salg bordet., Dette er antall poster som vi bare generert + 6 som vi i utgangspunktet hadde:

å Analysere gjennomføringsplaner

Nå som vi har noen data i vår tabell, kan vi virkelig demonstrere bruken av en indeks på visning. La oss spørre vEmployeeSalesOrders vise og se hvordan SQL Server henter data., Before executing the SELECT statement from below, make sure to include the Actual Execution Plan as shown below:

1
2
3
4

USE SQLShackDB;
GO
SELECT * FROM dbo.,vEmployeeSalesOrders;

Dette skriptet tilbake 23814 rader, men hva er mer viktig, er det generert gjennomføringsplan for spørringen. Husk at vi tidligere har falt indeksen på vårt vis. Så, akkurat nå er det ingen indeks på vårt vis. Derfor, SQL Server vil gjøre et par bord skanner, som vist nedenfor:

Dette er ganske mye det verste i databasen verden, spesielt på bord med en stor mengde data., Det er greit å ha bordet skanner med en liten mengde data som f.eks. tilfelle med våre Ansatte og Produkter bord, men det er dårlig for Salg tabellen fordi det har 50K+ poster.

Den enkleste måten å bli kvitt tabellen skanner er å opprette en indeks på det fordi det dramatisk hastigheter opp ting. Så, hva vil vi gjøre for å løse dette problemet er re-kjøre skriptet for å skape den unike samlet indeks på vEmployeeSalesOrders vise.

Nå, hvis vi bare å kjøre SELECT-setning, vil det ikke være noen forskjeller, selv om vi nettopp har opprettet indeks. Hvorfor er det slik?, Fordi jeg bruker SQL Server Express edition for formålet med denne serien, og bare i Virksomheten og Utvikler utgaver av SQL Server vil Query Optimizer faktisk ta indeksen i betraktning.

Ingen bekymringer fordi vi kan faktisk kraft SQL-Server for å bruke en indeks når du genererer gjennomføringsplaner. Dette er gjort ved hjelp av NOEXPAND-alternativet., NOEXPAND-gjelder bare til begrensede visninger:

1
VELG * FRA dbo.vEmployeeSalesOrders MED (NOEXPAND -)

Akkurat som at vi tvunget SQL Server å bruke den gruppert indeks som i utgangspunktet betyr ikke bruk den underliggende tabeller når du henter data., Som du kan se nedenfor, har vi gjort noen fremgang ved å eliminere en rekke operasjoner:

faktisk, vi kan executeboth VELG uttalelser samtidig og sammenligne resultatene ved å se på gjennomføring av planer:

Vil du se på det? Hvis vi sammenligner spørringen prisen for den første SELECT-setning (w/o indeks 95%) til den andre SELECT-setning (w/ index-5%), vil jeg si at det er en stor ytelse få hjelp av en enkel indeks.,

Konklusjon

Indekser er stor fordi de fart på resultatene, og med en indeks på et syn bør det virkelig fart på ytelse fordi indeksen er lagret i databasen. Indeksering både utsikt og bord er en av de mest effektive måter å forbedre resultatene av søk og programmer som bruker dem.

jeg ønsker å bryte opp ting, og er ferdig med denne serien av læring CREATE VIEW SQL-setningen med denne artikkelen. Vi har ganske mye dekket alt om å skape og endre synspunkter med T-SQL., Vi startet med CREATE VIEW SQL-setningen, skapte et par synspunkter, endret dem, slettet, og mye mer.

jeg håper denne serien av læring CREATE VIEW SQL-setningen har vært informativt for deg, og jeg takker for at du leser det.,

CREATE VIEW SQL: Sette inn data gjennom visninger i SQL Server

CREATE VIEW SQL: Arbeide med indeksert utsikt i SQL Server

  • Forfatter
  • Siste Innlegg
Bojan aka «Boksi», en AP utdannet i IT-Teknologi fokusert på Nettverk og elektronisk teknologi fra København School of Design og Teknologi, er en programvare som analytiker med erfaring i kvalitetssikring av programvare, et produkt evangelisering, og brukerens engasjement.,
Han har skrevet mye på både SQL Shack og ApexSQL Solution Center du kan, på emner som varierer fra klient teknologier som 4K-oppløsning og tematisere, feil håndtering for å indeks strategier, og overvåking av ytelse.
Bojan fungerer på ApexSQL i Nis i Serbia som en integrert del av team med fokus på å designe, utvikle og teste den neste generasjonen av database verktøy, inkludert MySQL og SQL Server, og både frittstående verktøy og integrasjoner inn i Visual Studio, SSMS, og VSCode.,
Se mer om Bojan på LinkedIn
Vis alle innlegg av Bojan Petrovic

Siste innlegg av Bojan Petrovic (se alle)
  • Visual Studio Koden for MySQL og MariaDB utvikling – August 13, 2020
  • OPPDATERINGEN for SQL syntaks forklart – 10. juli 2020
  • CREATE VIEW SQL: å Arbeide med indeksert utsikt i SQL Server – Mars 24, 2020

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *