Introduktion
Forespørgselsbutik er en ny funktion, introduceret i SQL Server 2016, som giver databaseadministratorer mulighed for historisk at gennemgå forespørgsler og deres tilknyttede planer ved hjælp af den grafiske brugergrænseflade, der er tilgængelig i SQL Server Management Studio, samt analysere forespørgselsydeevne ved hjælp af visse dynamiske administrationsvisninger. Query Store er en databaseomfattet konfigurationsmulighed og er tilgængelig til brug, hvis kompatibilitetsniveauet for den pågældende database er 130.
Query Store ligner sådanne teknologier i Oracle-databaseplatformen som Automatic Workload Repository (AWR). AWR fanger ydeevnestatistikker i endnu større skala end Query Store og giver en databaseadministrator mulighed for historisk at analysere ydeevnen. Sådanne koncepter som en opbevaringsperiode og opbevaringsgrænser for indsamlede data er tilgængelige i AWR-arkitekturen, som de er i Query Store. Følgende nøglekonfigurationsmuligheder er tilgængelige, når Query Store aktiveres:
- Driftstilstand: Bestemmer, om Query Store vil acceptere nyligt registrerede data (ReadWrite Mode) eller blot gemmer gamle data, der er tilgængelige for rapporter (Skrivebeskyttet tilstand)
- Data Flush Interval: Bestemmer, hvor ofte Query Store-hukommelsesbufferne tømmes til en disk. Husk, at Query Store-data er gemt i databasen, hvor Query Store er aktiveret. Standardværdien er 15 minutter.
- Interval for statistikindsamling: Bestemmer, hvor ofte forespørgselslagerets runtime-statistikker indsamles.
- Maksimal størrelse: Bestemmer, hvor meget lageret for Query Store-statistikker kan vokse. Som standard er det 100 MB.
- Forespørgselsbutik-optagelsestilstand: Bestemmer granulariteten af forespørgselsfangst. ALLE, AUTO og INGEN er de tilgængelige muligheder. Standardværdien er AUTO.
- Størrelsesbaseret oprydningstilstand: Bestemmer, om Query Store vil tømme gamle data, når den maksimale størrelse er nået.
- Forældet forespørgselstærskel: Bestemmer antallet af dage, som Query Store opbevarer data i. Standardværdien er sat til tredive dage.
Fig. 2 Forespørgselslagerindstillinger
Forespørgselslager er en databaseomfattet funktion, der kan aktiveres enten ved at bruge GUI (SQL Server Management Studio) eller ved at køre følgende kommando:
ALTER DATABASE [WideWorldImporters] SET QUERY_STORE =ON;
Forespørgselstelemetrien, der indsamles af Query Store, gemmes i systemtabeller i databasen, hvor Query Store er blevet aktiveret.
Eksempler på forespørgsler og standardrapporter
Indtil videre er alt, hvad jeg har skrevet, tilgængeligt fra mange andre kilder; nogle af dem kan findes i referencesektionen.
I dette afsnit skal vi se lidt dybere på, hvad vi faktisk kan gøre med Query Store, når vi har aktiveret det ved hjælp af simple eksempler. Lad os overveje følgende to forespørgsler:
Liste 1:Henter poster ved hjælp af et specifikt filter
brug WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchasing.PurchaseOrders ainner join Purchasing.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderId a.PurchaseOrder a.PurchaseOrder a.020MLReg 0S; før>Liste 2:Henter poster ved hjælp af et område
brug WideWorldImportersgoselecta.ContactPersonID,a.OrderDate,a.DeliveryMethodID,a.Comments,b.OrderedOutersfromPurchasing.PurchaseOrders ainner join Purchasing.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderLines bon a.PurchaseOrderID0Slikes%b.PurchaseID a0ML. /pre>Vær opmærksom på den alternative version af disse forespørgsler skrevet med store bogstaver:
Liste 1:Henter poster ved hjælp af et specifikt filter (store bogstaver)
BRUG WIDEWORLDIMPORTERSGOSELECTA.CONTACTPERSONID,A.ORDERDATE,A.DELIVERYMETHODID,A.COMMENTS,B.ORDEREDOUTERSFROMPURCHASING.PURCHASEORDERS AINNER JOIN JOIN PURCHASING.PURCHASEORDERLINES BOON A.PURCHASEORDERLINES BON A.PURCEORDERLINES BOON A.PURCEORDERLINES BON A.ORPURCEIDWORDERGODER'0RREPURCEORGODER'0REFERENCUE.2KØB2KØB2KØB2KØB'0MLKØB. før>Liste 2:Hentning af poster ved hjælp af et område (store bogstaver)
BRUG WIDEWORLDIMPORTERSGOSELECTA.CONTACTPERSONID,A.ORDERDATE,A.DELIVERYMETHODID,A.COMMENTS,B.ORDEREDOUTERSFROMPURCHASING.PURCHASEORDERS AINNER JOIN JOIN PURCHASING.PURCHASEORDERLINES BOON A.PURCHASEORDERLINES BOON A.PURCEORDERLINES BOON A.PURCEIDPHURCEORLIE0MLE'KØBESØB.KØB.KØB. /pre>Som du kan se, kørte vi disse forespørgsler flere gange ved hjælp af søgeordet GO. Derfor har vi en rimelig mængde data at arbejde med. Den første ting, vi bør være opmærksomme på, når vi bruger Query Store til at analysere ydeevne, er, at der er seks standardrapporter indbygget i SQL Server 2016 Query Store som vist i fig. 3.
Fig. 3 Forespørgselslagerrapporter
Navnene på rapporterne er beskrevet detaljeret i de tidligere artikler samt i Microsoft-dokumentationen. Dataene fra disse rapporter hentes fra de vigtigste Dynamic Management Views, der er angivet nedenfor:
Plan Stats DMV'er
- sys.query_store_query_text – indeholder unikke forespørgselstekster udført mod databasen
- sys.query_store_plan – indeholder en estimeret plan for forespørgslen med kompileringstidsstatistikken
- sys.query_context_settings – indeholder nogle unikke kombinationer af planen, der påvirker indstillinger, under hvilke forespørgsler udføres
- sys.query_store_query – forespørgselsindgange, der spores og tvinges separat i forespørgselslageret
DMV'er med kørselstidsstatistik
- sys.query_store_runtime_stats_interval – Query Store opdeler tid i automatisk genererede tidsvinduer (intervaller) og gemmer aggregerede statistikker for det interval for hver udført plan
- sys.query_store_runtime_stats – indeholder aggregeret runtime-statistik for udførte planer
Meget flere detaljer om, hvordan du bruger disse DMV'er, er tilgængelige i den refererede Microsoft-dokumentation. I denne artikel skal vi for det meste bruge GUI'en.
Som du kan se fra fig. 4, gennemgår vi rapporten over det overordnede ressourceforbrug, mens vi i det næste afsnit vil indsnævre de forespørgsler, vi anførte tidligere, og de data, vi kan hente fra disse simple forespørgsler.
Fig. 4 Rapport om overordnet ressourceforbrug
Analyse af forespørgsler ved hjælp af GUI
Et par vigtige ting bør betragtes som nyttige, når du bruger Query Store-rapporterne:
- Du kan konfigurere miljøet ved at klikke på knappen fremhævet i Fig. 4. Fig. 5 viser os de detaljer, vi kan ændre, så de passer til vores brugssituation:kriterier for data, der skal returneres, datointerval og datasæt, der skal returneres. Hvis jeg f.eks. vil se klart det forespørgsels-id, der er knyttet til de forespørgsler, jeg gennemgår, vil jeg for eksempel gerne reducere mit datasæt fra standard Top 25 til Top 10.
Fig. 5 Indstillinger for rapportkonfiguration
Fig. 6 Top 25 forespørgsler udført den 1. maj 2018
Fig. 7 Top 10 forespørgsler udført den 1. maj 2018
- Søjlediagrammet viser data for det meste med tid på x-aksen, men du kan bore ned i et specifikt datapunkt for at se data baseret på forespørgsels-id'er. Hvert forespørgsels-id bestemmer en specifik forespørgsel. Det er vigtigt at bemærke, at en forespørgsel er entydigt identificeret ved at hash teksten. En forespørgsel med små bogstaver adskiller sig således fra den samme forespørgsel med store bogstaver. Dette burde være almindeligt kendt:Ad-hoc-forespørgsler er et problem for plancachen, og de er også dårlige for forespørgselslageret både med hensyn til pladsforbrug og korrekt analyse.
Fig. 8 Forespørgsel i liste 1 (små bogstaver, forespørgsel 42480)
Fig. 9 Forespørgsel i liste 3 (store bogstaver, forespørgsel 42490)
- Den tredje vigtige observation er det faktum, at når et datapunkt er fremhævet grønt, vedrører den detaljerede udførelsesplan vist i den nederste rude det pågældende datapunkt. I fig. 7 refererer dette datapunkt til forespørgsels-ID 42481, som vi tidligere udførte (fuld forespørgsel vist i liste 2). Holder vi musen over dette datapunkt, vises forespørgslen, dens ID og antallet af planer, der er knyttet til denne forespørgsel (se fig. 8).
Fig. 10 Forespørgsel 42481 Detaljer
Vores forespørgsel blev udført 1391 gange, da den er nøjagtigt fanget af Query Store og vist i y-aksen (udførelsesantal) på søjlediagrammet i fig. 10. Rapporten blev trukket, mens batchen stadig blev udført. Vi har således ikke det fulde antal (1500), der informerer os om, at der er en realtidsopsamling af data, hver gang en forespørgsel udføres. På højre side ser vi også, at Planen bliver brugt til disse mange henrettelser (Plan 675). Vi kan bekræfte dette ved at bruge forespørgslen i liste 5.
Fortegnelse 5
BRUG WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_query_query_ON. .query_text_idwhere Qry.query_id=42481;
Fig. 11 Forespørgsels-id og plan-id fra DMV'er
En lille smule tuning
Lad os tage et kig på en anden forespørgsel.
Når vi kører forespørgslen i liste 6 og undersøger detaljerne fra Query Store, afslører udførelsesplandetaljerne, at vi har brug for et indeks for at opnå en forbedring på 51 %.
Fortegnelse 6:Suboptimal forespørgsel
SELECT TOP (1000) [OrderLineID] ,[OrderID] ,[StockItemID] ,[Description] ,[PackageTypeID] ,[Quantity] ,[UnitPrice] ,[TaxRate] ,[PickedQuantity] ,[PickingCompleted,BNarn. ] ,[LastEditedWhen] FRA [WideWorldImporters].[Salg].[OrderLines] hvor enhedspris> 1000 GO 2000
Fig. 12 Suboptimale forespørgselsdetaljer
Fig. 13 Suboptimal plan for udførelse af forespørgsler
Når vi har oprettet det anbefalede indeks ved hjælp af sætningen i liste 7, får vi Query Optimizer til at generere en ny eksekveringsplan. I dette tilfælde forventes den nye udførelsesplan at forbedre ydeevnen. Der er dog tilfælde, hvor visse ændringer kan forårsage forringet ydeevne, såsom betydelige ændringer i datavolumen, der effektivt ugyldiggør statistikker eller reducerer antallet af indekser og så videre. Sådanne forespørgsler siges at være gået tilbage i ydeevne og kan undersøges ved hjælp af rapporten Regrerede forespørgsler i Query Store.
Fortegnelse 7:Oprettelse af indeks
BRUG [WideWorldImporters]GOCREATE NOT-CLUSTERED INDEX [Custom_IX_UnitPrice]PÅ [Salg].[OrderLines] ([UnitPrice])INKLUDERE([OrderLineID],[OrderID],[StockItemID],[Description],[PackageQuantity]] ],[TaxRate],[PickedQuantity],[PickingCompletedWhen],[LastEditedBy],[LastEditedWhen])GO
Fig. 14 Optimeret forespørgsel (Ændring i udførelsesplan)
Fig. 15 Optimeret forespørgsel (to planer)
Fig. 16 Optimeret forespørgsel (Force Plan)
Når der er flere planer for en forespørgsel som vist i fig. 14 og fig. 16, kan vi fortælle optimeringsværktøjet altid at bruge en plan, vi vælger, ved at klikke på knappen Force Plan. Dette var en lidt kedelig opgave i de tidligere versioner af SQL Server.
Som du kan se i fig. 17, giver Query Store os mulighed for at sammenligne de forskellige planer, der er forbundet med en forespørgsel, ved hjælp af en række metrics.
Fig. 17 Sammenligning af udførelsesplaner
Igen kan vi bruge forespørgslen i liste 8 til at verificere planerne forbundet med dette forespørgsels-id ved hjælp af DMV'er. (Se fig. 11)
Fortegnelse 8:Planer knyttet til forespørgsel 42497
BRUG WideWorldImportersGOSELECT Txt.query_text_id, Txt.query_sql_text, Pl.plan_id, Qry.*FROM sys.query_store_plan AS PlJOIN sys.query_store_query AS Qry ON Pl.query_id =Qry.query_query_query_ON. .query_text_idwhere Qry.query_id=42497;
Udforske variationer
En anden nyttig rapport, som Query Store benytter os af, er Queries With High Variation. Denne rapport viser os, hvor langt fra hinanden de ønskede metrics er for en specifik forespørgsel over en given periode. Dette er meget nyttigt til historisk analyse af ydeevne. Ved hjælp af udsagn i liste 9 genererer vi data, der kan give et billede af, hvordan variationer ville se ud. Trinnene i proceduren opretter ganske enkelt en lille tabel og indsætter derefter poster med forskellige batchstørrelser.
Fortegnelse 9:Planer knyttet til forespørgsel 42497
brug WideWorldImportersgo-- Opret en tabelopret tabel tableone(ID int identitet(1000,1),FirstName varchar(30),Efternavn varchar(30),CountryCode char(2),Lejedato dato2 standard getdate());-- Indsæt poster i Batches of Different Sizesinsert i tableone-værdier ('Kenneth','Igiri','NG',getdate());GO 10000insert into tableone-værdier ('Kwame','Boateng','GH', getdate());GO 10insert into tableone-værdier ('Philip','Onu','NG',getdate());GO 100000insert into tableone-værdier ('Kwesi','Armah','GH', getdate());GO 100
Query Store viser os detaljer såsom minimums- og maksimumværdierne for disse metrics for specifikke udførelsesintervaller for den forespørgsel, vi er interesserede i. I dette eksempel finder vi ud af, at dette blot er et resultat af antallet af batches pr. udførelse (bemærk, at parametre faktisk bruges til at udføre INSERT-sætningen). I produktionen kan andre faktorer være ansvarlige for sådanne variationer.
Fig. 18 Variationer i varighed
Fig. 19 Variation i logiske skrivninger
Fig. 20 Variation i fysiske aflæsninger
Konklusion
I denne artikel har vi gennemgået SQL Server 2016 Query Store GUI-miljøet og et par ting, vi kan udlede vedrørende ydeevnen af vores instans (med hensyn til SQL) ved hjælp af Query Store. Der er adskillige artikler på internettet, der viser endnu mere avancerede use cases og meget dybere forklaringer af det interne. Denne artikel burde være til god nytte for DBA'er på mellemniveau, der ønsker at få et forspring med at bruge Query Store til evaluering/justering af ydeevne.
Referencer
- Bedste praksis med Query Store
- Cristiman, L. (2016) Query Store – Indstillinger og begrænsninger
- Overvågning af ydeevne ved at bruge Query Store
- Forespørgsel i butikskatalogvisninger
- Forespørg på lagrede procedurer
- Query Store – Sådan fungerer det, og hvordan du bruger det
- Forespørgselsscenarier for butik
- Van de Lar, E. (2016) SQL Server 2016 Query Store:Forcing Execution Plans Using the Query Store
Nyttigt værktøj:
dbForge Query Builder til SQL Server – giver brugerne mulighed for hurtigt og nemt at bygge komplekse SQL-forespørgsler via en intuitiv visuel grænseflade uden manuel kodeskrivning.