SQLShack (Suomi)

Tämä on neljäs artikkeli sarjassa oppiminen LUO NÄKYMÄ SQL-lause. Tähän mennessä olemme tehneet paljon luoda ja muuttaa näkymiä käyttämällä T-SQL. Tässä viimeisessä osassa haluan katsoa, miten indeksoiduilla näkymillä toimitaan.

Kuten aina, seurata yhdessä sarjassa, se on erittäin suositeltavaa lukea aiemmat osat ensin ja sitten tämä yksi., Tämä on lähinnä siksi olemme luoneet oman näytteen tietokantaan ja esineitä tyhjästä, että käytämme tässä osansa, mutta myös koska se on paljon helpompi nähdä iso kuva.

– Tässä ovat aiemmat kolme kappaletta LUODA NÄKYMÄ SQL-sarja:

  • Luoda näkymiä SQL Server –
  • Muuttaa näkymiä SQL Server –
  • Lisäämällä tietoja kautta näkemyksiä SQL-Palvelin

Joten, pään yli ja lue ne ennen kuin jatkat tämän kanssa.

Johdanto

ensimmäinen asia, jonka teemme, on luoda indeksoitu näkymä., Käytämme tietenkin CREATE VIEW SQL-lausumaa tähän, kuten teimme monta kertaa sarjan kautta. Mutta yleinen ajatus, kuten otsikko sanoo, on nähdä, miten työskennellä indeksoitu näkemyksiä, mitä vaatimukset ovat lisäämällä indeksi näkymä, ja miten tehdä se ohjelmallisesti. Lisäksi, selittää etuja indeksoitu näkemyksiä, tarkastelemme teloitukset suunnitelmat SQL Server. Ne ovat loistava työkalu DBAs ja kehittäjille, kun se tulee löytää ja vahvistamisesta pullonkaula hidas käynnissä kysely.,

pitemmittä puheitta, katsotaanpa luoda näkymän, käyttäen LUODA NÄKYMÄ SQL-käskyn alla ja nähdä, mitä se tekee:

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

KÄYTTÄÄ SQLShackDB;
MENNÄ
LUO NÄKYMÄ dbo.,palkkatyöntekijät
, joilla on KAAVAMERKINTÄ

valitse työntekijät.Työllisyystuki,
tuotteet.ProductID,
summa(hinta * määrä) Saletotaalina,
SaleDate
DBO: lta.Työntekijät
liittyvät dbo: hin.Myynti työntekijöille.Työllisyys = Myynti.Työllistyneet
liity dbo: hin.Tuotteet myynnissä.ProductID = Tuotteet.ProductID
group BY Employees.Työllisyystuki,
tuotteet.ProductID,
Sales.,SaleDate;
MENNÄ

Huomaa, että tämä näkemys on KANSSA SCHEMABINDING vaihtoehdon sille. Syy, miksi se on tämä vaihtoehto päälle on, koska kun luodaan indeksit näkemyksiä, ne todella fyysisesti tallennetaan tietokantaan. Toisin sanoen, kaikki mihin tämä näkemys perustuu, mitä taulukoihin tulee, rakenne ei voi muuttua siitä, mihin viittaamme.

siksi se on sidottava taustalla oleviin taulukoihin, jotta emme voi muuttaa niitä tavalla, joka vaikuttaisi näkymän määritelmään., Jos yritämme muuttaa niitä millään tavalla, SQL Server heittää virhe sanomalla, että tämä näkymä riippuu jotain. Niin, katso sitä kova vaatimus luoda indeksi näkymä.

Kun komento on suoritettu onnistuneesti, sinun pitäisi nähdä vEmployeeSalesOrders näkymä Näkymät-kohdassa kansio Object Explorer kuten alla:

määrittely näkymä on hieman enemmän monimutkainen kysely. Saimme aggregaatin SELECT-lausekkeessa, jota seuraa ryhmä lausekkeella., Muista, että kun meillä on aggregaatti kyselyssä, se lisää numerot yhteen, joten meidän on oltava ryhmä lausekkeittain.

periaatteessa, kun on ryhmä kyselyssä, meidän on ryhmiteltävä kaikki, mikä on valitulla listalla paitsi aggregaatti.,

Nyt, olen jo luonut näkymän, mutta muista, että se on aina hyvä idea testata määritelmä tarkastella käynnissä vain VALITA osa LUODA NÄKYMÄ SQL nähdä, mitä se palaa:

eteenpäin, tässä on miten voit tarkistaa, onko Schema sidottu vaihtoehto on käytössä tai pois käytöstä., Pään yli Object Explorer, laajentaa Näkemyksiä, napsauta näytä ja valitse Ominaisuudet:

Joukossa kaikki muut tiedot Näytä Ominaisuudet-ikkuna, voit nähdä, jos Skeema sidottu vaihtoehto on True tai False Yleiset-sivu.

luodaan indeksoituja katselukertoja

siirrytään eteenpäin ja luodaan indeksi näkemyksellemme., 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(EmployeeID, ProductID, SaleDate);
MENNÄ

Jos me osuma Execute-painiketta SSMS SQL Server heittää virheen sanomalla, että indeksi voi olla luotu:

Tässä on koko virhe viesti, että ei voi nähdä kuvassa yllä:

ei Voi luoda indeksi view ’SQLShackDB.dbo.työttömyysetuudet”, koska sen valintaluetteloon ei sisälly KREIVI_BIGIN asianmukaista käyttöä. Harkitse COUNT_BIGIN(*) lisäämistä luetteloon.,

tässä tapauksessa tarvitsemme KREIVI_BIGIÄ, koska käytämme ryhmää näkemyksemme mukaan.

yleensä, jos käytämme aggregaatteja kuten kreivi, summa, AVG jne. indeksin valikointiluetteloon on myös sisällytettävä KREIVI_BIG, jotta siihen voidaan luoda indeksi.

That ’s tely what we’ re going to do.,käyttämällä LUO NÄKYMÄ SQL ja lisää COUNT_BIG valitse lista käyttämällä kirjoitus alla:

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

KÄYTTÄÄ SQLShackDB;
MENNÄ
MUUTA NÄKYMÄÄ dbo.,palkkatyöntekijät
, joilla on KAAVAMERKINTÄ

valitse työntekijät.Työllisyystuki,
tuotteet.ProductID,
SUM(hinta * määrä) KUIN SaleTotal,
SaleDate,
COUNT_BIG(*) KUIN RecordCount
FROM dbo.Työntekijät
liittyvät dbo: hin.Myynti työntekijöille.Työllisyys = Myynti.Työllistyneet
liity dbo: hin.Tuotteet myynnissä.ProductID = Tuotteet.ProductID
group BY Employees.Työllisyystuki,
tuotteet.ProductID,
Sales.,SaleDate;
MENNÄ

Jos mietit, miksi näin tapahtuu, tässä tapauksessa, vastaus on, koska SQL-Palvelin tarvitsee tapa seurata määrä ennätys, että olemme siirtymässä indeksi ja tämä on myös yksi koko joukko rajoituksia luoda indeksoitu näkemyksiä.

toistaiseksi kaikki näyttää hyvältä. Olemme onnistuneesti muuttaneet määritelmää meidän näkymä:

Nyt, voimme saada takaisin luoda indeksi näkymä suorittamalla aiemmin käytetty script yksi enemmän aikaa., Tällä kertaa toiminta päättyy sujuvasti. Jos menemme Object Explorer ja laajentaa Indeksit kansioon mielestämme, voimme nähdä, että juuri luotu indeksi:

täältä, jos me klikkaa hiiren oikealla indeksi ja valitse Ominaisuudet, Yleiset-sivun, voit nähdä nimi, indeksi, nimi, tyyppi, avain sarakkeet, jne.,:

Jos me siirtyä Varastointi, näet, että se on Filegroup, koska se on fyysisesti tallennettu tietokantaan:

Lisäksi, jos me siirtyä Hajanaisuudesta, sen pitäisi sanoa, että Koko hajanaisuus on nolla prosenttia, koska meillä on vain pari kirjaa meidän taulukoita:

Etsivät yksityiskohtaisia, mutta hauska ja helppo lukea pohjamaali ylläpitäminen ja seuranta SQL-indeksit? Tutustu SQL-indeksin ylläpitoon.,

poistetaan indeksit

ennen kuin mennään pidemmälle, katsotaan miten indeksin voi poistaa. Helpoin tapa on hiiren kakkospainikkeella hakemistoa Olio Explorerissa ja käyttää Delete-vaihtoehtoa. Mutta jos sinun täytyy pudottaa useita indeksejä kerralla, DROP INDEX lausunto on kätevä. Se on mitä aiomme tehdä, koska loppujen lopuksi tämä on T-SQL – sarja oppimisen luo näkymä SQL lauseke.,

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;
MENNÄ

Kun sinun täytyy pudottaa useita indeksejä, vain määritä kaikki nimet erotetaan pilkulla.

Tuottaa satunnaisia tietoja

Nyt, että pääsimme eroon indeksi, nyt luoda joitakin satunnaisia tietoja meidän pöydälle niin, että voimme tarkastella suorittamisen suunnitelma ja nähdä, miten SQL-Palvelin hakee tiedot konepellin alle. Suoritussuunnitelman analysointi näyttää eron siinä, miten suoritukseen vaikuttaa kyselyn suorittaminen näkymässä olevalla indeksillä ja ilman sitä.,

Käytä script alla lisätä 50000 satunnainen kirjaa osaksi Myynti-taulukko:

en aio kävellä läpi käsikirjoituksen yksityiskohtia, mutta se on pohjimmiltaan, että silmukka tulee suorittaa 50000 kertaa, ja aseta satunnainen datan Myynti pöytä., jos haluat tarkistaa, onko kirjaa olivat liitetään onnistuneesti, suorita seuraava VALITSE ilmoitus, että lasketaan kaikki ennätykset Myynnistä taulukko:

1
2
3
4

KÄYTTÄÄ SQLShackDB;
MENNÄ
SELECT COUNT(*) Myynti

määrä palasi osoittaa, että siellä olet 50006 rivejä Myynti pöytä., Tämä on tietueiden määrä, että me vain syntyy + 6, joka meillä alun perin oli:

Analysointi toteutus suunnitelmat

– Nyt meillä on joitakin tietoja meidän taulukossa, emme voi todella osoittaa käyttää index-view. Kysytään vemploesalesorders näkymä ja nähdä, miten SQL Server hakee tiedot., 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;

Tämä kirjoitus palasi 23814 riviä, mutta mikä on tärkeämpää, se syntyy toteutussuunnitelman kyselyn. Muista, että olemme aiemmin pudottaneet indeksin näkemyksemme. Tällä hetkellä näkemyksessämme ei ole indeksiä. Tämän vuoksi SQL Server tulee tehdä muutamia tauluja kuten alla:

Tämä on aika lailla pahinta, mitä tietokantaan maailmassa, erityisesti taulukoita, joissa on suuri määrä dataa., Se on okei olla taulukko skannaa kanssa pieni määrä tietoa, esim. tapauksessa, jossa työntekijämme ja Tuotteiden taulukoita, mutta se on huono Myynti taulukko, koska se on 50K+ kirjaa.

helpoin tapa päästä eroon taulukon tiedot on luoda indeksi, koska se merkittävästi nopeuttaa asioita. Joten, mitä teemme korjata tämän ongelman on uudelleen suorittaa skripti luoda ainutlaatuinen clustered indeksi v employeesalesorders näkymä.

nyt, jos vain ajetaan SELECT statement, ei tule eroja, vaikka juuri laadimme indeksin. Miksi?, Koska olen käyttäen SQL Server Express edition tässä sarja, ja vain Enterprise edition-ja Developer edition-versioissa, SQL Server Query Optimizer todella ottaa index huomioon.

ei hätää, koska voimme itse asiassa pakottaa SQL Serverin käyttämään indeksiä toteutussuunnitelmia laadittaessa. Tämä tapahtuu NOEXPAND-vaihtoehdon avulla., NOEXPAND koskee vain indeksoitu näkemyksiä:

1
SELECT * FROM dbo.vEmployeeSalesOrders KANSSA (NOEXPAND)

Aivan kuten että, meidän on pakko SQL Server käyttää klusteroitu indeksi, joka tarkoittaa käytännössä sitä, älä käytä taustalla pöydät kun noudettaessa tietoja., Kuten voidaan nähdä alla, olemme tehneet jonkin verran poistamalla useita operaatioita:

Itse asiassa, voimme executeboth VALITSE lausuntoja samanaikaisesti ja vertaa tuloksia tarkastelemalla toteuttamisen suunnitelmat:

katso, että? Jos vertaamme kyselyn kustannukset ensimmäisen SELECT (w/o-indeksi 95%) toisen SELECT (w/ index 5%), sanoisin, että se on valtava suorituskyky voitto yhdellä indeksi.,

Johtopäätös

Indeksit ovat suuria, koska ne nopeuttaa suorituskykyä ja indeksi jotta se olisi todella nopeuttaa suorituskykyä, koska indeksi on tallennettu tietokantaan. Sekä näkymien että taulukoiden indeksointi on yksi tehokkaimmista tavoista parantaa kyselyiden ja niitä käyttävien sovellusten suorituskykyä.

haluaisin paketoida asiat ja viimeistellä tämän OPPIMISSARJAN CREATE VIEW SQL statement tällä artikkelilla. Olemme kattaneet kaiken näköalojen luomisesta ja muuttamisesta T-SQL: llä., Aloitimme CREATE VIEW SQL statement, luonut muutamia katselukertoja, muuttanut niitä, poistettu, ja paljon muuta.

toivon, että tämä sarja oppiminen LUO NÄKYMÄ SQL on ollut informatiivinen sinulle ja kiitos, että luet sen.,

LUO NÄKYMÄ SQL: Lisäämällä tietoja kautta näkemyksiä SQL Server

LUO NÄKYMÄ SQL: Työskentely indeksoitu näkymiä SQL Server –

  • Tekijä
  • Viimeisimmät Viestit
Bojan aka ”Boksi”, AP valmistunut tietotekniikan keskittyi Verkostojen ja sähköisen teknologian Copenhagen School of Design ja Tekniikka on ohjelmisto, analyytikko, jolla on kokemusta laadunvarmistuksesta, ohjelmisto, tuki -, tuote-evankeliointi, ja käyttäjän osallistumista.,
Hän on kirjoittanut laajasti sekä SQL-Shack ja ApexSQL Ratkaisu Center aiheista, jotka vaihtelevat asiakkaan teknologioita kuten 4K resoluutio ja teemoja, virhe käsittely-indeksi strategioiden ja suorituskyvyn seuranta.
Bojan töissä ApexSQL Nis, Serbia olennaisena osana joukkue keskittyy suunnitteluun, kehittämiseen ja testaukseen seuraavan sukupolven tietokannan työkaluja, kuten MySQL-ja SQL Server, ja sekä stand-alone työkaluja ja integraatiot osaksi Visual Studio, SSMS, ja VSCode.,
näytä enemmän siitä, Bojan LinkedIn
Näytä kaikki viestit Bojan Petrovic

Uusimmat viestit Bojan Petrovic (katso kaikki)
  • Visual Studio Code for MySQL ja MariaDB kehitys – elokuu 13, Vuoteen 2020 mennessä
  • SQL UPDATE-syntaksi selitti – 10. heinäkuuta 2020 mennessä
  • LUO NÄKYMÄ SQL: Työskentely indeksoitu näkemyksiä SQL Server – Maaliskuu 24, 2020

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *