Delen via


Prestaties bewaken met Query Store

VAN TOEPASSING OP: Azure Database for PostgreSQL - Flexibele server

Query store is een functie in azure Database for PostgreSQL flexibele server die een manier biedt om queryprestaties in de loop van de tijd bij te houden. Query Store vereenvoudigt het oplossen van prestatieproblemen door u te helpen snel de langst lopende en meest resource-intensieve query's te vinden. Query Store legt automatisch een geschiedenis van query's en runtimestatistieken vast en bewaart deze voor uw beoordeling. Hiermee worden de gegevens gesegmenteerd op tijd, zodat u tijdelijke gebruikspatronen kunt zien. Gegevens voor alle gebruikers, databases en query's worden opgeslagen in een database met de naam azure_sys in het flexibele serverexemplaren van Azure Database for PostgreSQL.

Query store inschakelen

Query Store is beschikbaar voor gebruik zonder extra kosten. Het is een opt-in-functie, dus deze is niet standaard ingeschakeld op een server. Querystore kan globaal worden ingeschakeld of uitgeschakeld voor alle databases op een bepaalde server en kan niet per database worden ingeschakeld of uitgeschakeld.

Belangrijk

Schakel querystore niet in op de prijscategorie Burstable, omdat dit invloed zou hebben op de prestaties.

Query store inschakelen in Azure Portal

  1. Meld u aan bij Azure Portal en selecteer uw exemplaar van flexibele Azure Database for PostgreSQL-server.
  2. Selecteer Serverparameters in de sectie Instellingen van het menu.
  3. Zoek de pg_qs.query_capture_mode parameter.
  4. Stel de waarde in op top of all, afhankelijk van of u query's op het hoogste niveau of geneste query's wilt bijhouden (de query's die in een functie of procedure worden uitgevoerd) en selecteer Opslaan. Het duurt maximaal 20 minuten voordat de eerste batch gegevens in de azure_sys database kan worden bewaard.

Wachtsampling van querystore inschakelen

  1. Zoek de pgms_wait_sampling.query_capture_mode parameter.
  2. Stel de waarde in op all en sla deze op.

Informatie in het queryarchief

Query Store bestaat uit twee winkels:

  1. Een runtimestatistiekenarchief voor het persistent maken van de gegevens van de queryuitvoeringsstatistieken.
  2. Een wachtstatistiekenarchief voor persistente informatie over wachtstatistieken.

Veelvoorkomende scenario's voor het gebruik van querystore zijn:

  • Bepalen hoe vaak een query in een bepaald tijdvenster is uitgevoerd.
  • Vergelijk de gemiddelde uitvoeringstijd van een query in tijdvensters om grote variaties te zien.
  • Het identificeren van langst lopende query's in de afgelopen uren.
  • De belangrijkste N-query's identificeren die op resources wachten.
  • Inzicht in de aard van de wachttijden voor een bepaalde query.

Om het ruimtegebruik te minimaliseren, worden de uitvoeringsstatistieken van runtime in het archief met runtimestatistieken geaggregeerd in een vast, configureerbaar tijdvenster. De informatie in deze winkels kan worden opgevraagd met behulp van weergaven.

Toegang tot queryopslaggegevens

Queryopslaggegevens worden opgeslagen in de azure_sys database op uw flexibele serverexemplaren van Azure Database for PostgreSQL. De volgende query retourneert informatie over query's die zijn vastgelegd in het queryarchief:

SELECT * FROM  query_store.qs_view;

En deze query retourneert informatie over wachtstatistieken:

SELECT * FROM  query_store.pgms_wait_sampling_view;

Wachtquery's zoeken

Wachtgebeurtenissen combineren verschillende wachtgebeurtenissen in buckets op gelijkenis. Het queryarchief bevat het gebeurtenistype wacht, de specifieke naam van de wacht gebeurtenis en de query in kwestie. Als u deze wachtinformatie kunt correleren met de statistieken van de queryruntime, krijgt u meer inzicht in wat bijdraagt aan de prestatiekenmerken van query's.

Hier volgen enkele voorbeelden van hoe u meer inzicht krijgt in uw workload met behulp van de wachtstatistieken in querystore:

Observatie Actie
Hoge vergrendelingswachttijden Controleer de queryteksten voor de betrokken query's en identificeer de doelentiteiten. Zoek in het queryarchief naar andere query's die regelmatig worden uitgevoerd en/of een hoge duur hebben en dezelfde entiteit wijzigen. Nadat u deze query's hebt geïdentificeerd, kunt u overwegen de toepassingslogica te wijzigen om gelijktijdigheid te verbeteren of een minder beperkend isolatieniveau te gebruiken.
Io-wachttijden met hoge buffer Zoek de query's met een groot aantal fysieke leesbewerkingen in het queryarchief. Als ze overeenkomen met de query's met hoge IO-wachttijden, kunt u overwegen om de functie voor automatisch afstemmen van indexen in te schakelen om te zien of het kan worden aanbevolen om een aantal indexen te maken die het aantal fysieke leesbewerkingen voor deze query's kunnen verminderen.
Hoge geheugenwachttijden Zoek de query's die het meest geheugen verbruiken in het queryarchief. Deze query's vertragen waarschijnlijk verdere voortgang van de betrokken query's.

Configuratieopties

Wanneer het queryarchief is ingeschakeld, worden gegevens opgeslagen in aggregatievensters met de lengte die wordt bepaald door de serverparameter pg_qs.interval_length_minutes (standaard ingesteld op 15 minuten). Voor elk venster worden maximaal 500 afzonderlijke query's per venster opgeslagen. Kenmerken die de uniekheid van elke query onderscheiden, zijn user_id (id van de gebruiker die de query uitvoert), db_id (id van de database in de context waarin de query wordt uitgevoerd) en query_id (een geheel getal dat de uitgevoerde query uniek identificeert). Als het aantal afzonderlijke query's gedurende het geconfigureerde interval 500 bereikt, wordt 5% van de opgenomen query's ongedaan gemaakt om ruimte te maken voor meer. De toewijzingen die eerst ongedaan zijn gemaakt, zijn de toewijzingen die het minste aantal keren zijn uitgevoerd.

De volgende opties zijn beschikbaar voor het configureren van Query Store-parameters:

Parameter Beschrijving Standaard Bereik
pg_qs.interval_length_minutes (*) Leg het interval vast in minuten voor het queryarchief. Definieert de frequentie van gegevenspersistentie. 15 1 - 30
pg_qs.is_enabled_fs Alleen intern gebruik: deze parameter wordt gebruikt als schakeloptie voor het overschrijven van functies. Als dit wordt weergegeven als uitgeschakeld, is querystore uitgeschakeld, ondanks de waarde die is ingesteld voor pg_qs.query_capture_mode. on on, off
pg_qs.max_plan_size Maximum aantal bytes dat is opgeslagen in queryplantekst per queryarchief; langere abonnementen worden afgekapt. 7500 100 - 10000
pg_qs.max_query_text_length Maximale querylengte die kan worden opgeslagen; langere query's worden afgekapt. 6000 100 - 10000
pg_qs.parameters_capture_mode Hiermee wordt aangegeven of en wanneer querypositieparameters moeten worden vastgelegd. capture_parameterless_only capture_parameterless_only, capture_first_sample
pg_qs.query_capture_mode Instructies die moeten worden bijgehouden. none none, , topall
pg_qs.retention_period_in_days Bewaarperiodeperiode in dagen voor querystore. Oudere gegevens worden automatisch verwijderd. 7 1 - 30
pg_qs.store_query_plans Of queryplannen moeten worden opgeslagen in het queryarchief. off on, off
pg_qs.track_utility Of querystore hulpprogrammaopdrachten moet bijhouden. on on, off

(*) Statische serverparameter waarvoor een server opnieuw moet worden opgestart voor een wijziging in de waarde ervan, wordt van kracht.

De volgende opties zijn specifiek van toepassing op wachtstatistieken:

Parameter Beschrijving Standaard Bereik
pgms_wait_sampling.history_period Frequentie, in milliseconden, waarbij wachtgebeurtenissen worden bemonsterd. 100 1 - 600000
pgms_wait_sampling.is_enabled_fs Alleen intern gebruik: deze parameter wordt gebruikt als schakeloptie voor het overschrijven van functies. Als dit wordt weergegeven als off, wachtsampling is uitgeschakeld ondanks de waarde die is ingesteld voor pgms_wait_sampling.query_capture_mode. on on, off
pgms_wait_sampling.query_capture_mode Welke instructies de pgms_wait_sampling extensie moet volgen. none none, all

Notitie

pg_qs.query_capture_modepgms_wait_sampling.query_capture_modevervangt . Als pg_qs.query_capture_mode dat het is none, heeft de pgms_wait_sampling.query_capture_mode instelling geen effect.

Gebruik Azure Portal om een andere waarde voor een parameter op te halen of in te stellen.

Weergaven en functies

U kunt query's uitvoeren op de gegevens die zijn vastgelegd door het queryarchief en of deze verwijderen met behulp van enkele weergaven en functies die beschikbaar zijn in het query_store schema van de azure_sys database. Iedereen in de openbare PostgreSQL-rol kan deze weergaven gebruiken om de gegevens in het queryarchief te bekijken. Deze weergaven zijn alleen beschikbaar in de azure_sys-database .

Query's worden genormaliseerd door naar hun structuur te kijken en niets te negeren dat niet semantisch significant is, zoals letterlijke, constanten, aliassen of verschillen in hoofdletters.

Als twee query's s semantisch identiek zijn, zelfs als ze verschillende aliassen gebruiken voor dezelfde kolommen en tabellen waarnaar wordt verwezen, worden ze geïdentificeerd met dezelfde query_id. Als twee query's alleen verschillen in de letterlijke waarden die in deze query's worden gebruikt, worden ze ook geïdentificeerd met dezelfde query_id. Voor query's die zijn geïdentificeerd met dezelfde query_id, is de sql_query_text die van de query die eerst werd uitgevoerd sinds de queryopslag de opnameactiviteit begon of sinds de laatste keer dat de persistente gegevens werden verwijderd omdat de functie query_store.qs_reset is uitgevoerd.

Hoe querynormalisatie werkt

Hier volgen enkele voorbeelden om te illustreren hoe deze normalisatie werkt:

Stel dat u een tabel maakt met de volgende instructie:

create table tableOne (columnOne int, columnTwo int);

U schakelt Query Store-gegevensverzameling in en één of meerdere gebruikers voeren de volgende query's uit, in deze exacte volgorde:

select * from tableOne;
select columnOne, columnTwo from tableOne;
select columnOne as c1, columnTwo as c2 from tableOne as t1;
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one";

Alle vorige query's delen dezelfde query_id. En de tekst die Query Store bewaart, is die van de eerste query die wordt uitgevoerd na het inschakelen van gegevensverzameling. Daarom zou het zijn select * from tableOne;.

De volgende set query's, zodra genormaliseerd, komt niet overeen met de vorige set query's, omdat de WHERE-component ze semantisch anders maakt:

select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;
select * from tableOne where columnOne = -3 and columnTwo = -3;
select columnOne, columnTwo from tableOne where columnOne = '5' and columnTwo = '5';
select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = 7 and columnTwo = 7;

Alle query's in deze laatste set delen echter dezelfde query_id en de tekst die wordt gebruikt om ze allemaal te identificeren, is dat van de eerste query in de batch select columnOne as c1, columnTwo as c2 from tableOne as t1 where columnOne = 1 and columnTwo = 1;.

Ten slotte vindt u hieronder enkele query's die niet overeenkomen met de query_id van de query's in de vorige batch en de reden waarom ze niet:

Query:

select columnTwo as c2, columnOne as c1 from tableOne as t1 where columnOne = 1 and columnTwo = 1;

Reden om niet overeen te komen: Lijst met kolommen verwijst naar dezelfde twee kolommen (columnOne en ColumnTwo), maar de volgorde waarin ze worden verwezen, wordt omgekeerd, van columnOne, ColumnTwo in de vorige batch naar ColumnTwo, columnOne in deze query.

Query:

select * from tableOne where columnTwo = 25 and columnOne = 25;

Reden om niet overeen te komen: volgorde waarin de expressies die in de WHERE-component worden geëvalueerd, worden omgekeerd van columnOne = ? and ColumnTwo = ? in de vorige batch naar ColumnTwo = ? and columnOne = ? in deze query.

Query:

select abs(columnOne), columnTwo from tableOne where columnOne = 12 and columnTwo = 21;

Reden om niet overeen te komen: de eerste expressie in de kolomlijst is niet columnOne meer, maar functie abs geëvalueerd over columnOne (abs(columnOne)), wat niet semantisch equivalent is.

Query:

select columnOne as "column one", columnTwo as "column two" from tableOne as "table one" where columnOne = ceiling(16) and columnTwo = 16;

Reden om niet overeen te komen: De eerste expressie in de WHERE-component evalueert niet meer de gelijkheid van columnOne een letterlijke waarde, maar met het resultaat van de functie ceiling die wordt geëvalueerd over een letterlijke waarde, wat niet semantisch equivalent is.

Weergaven

query_store.qs_view

Deze weergave retourneert alle gegevens die worden bewaard in de ondersteunende tabellen van het queryarchief. Gegevens die nog steeds in het geheugen worden opgenomen voor het actieve tijdvenster, zijn pas zichtbaar als het tijdvenster aan een einde komt en de in-memory vluchtige gegevens worden verzameld en bewaard in tabellen die op schijf zijn opgeslagen. Deze weergave retourneert een andere rij voor elke afzonderlijke database (db_id), gebruiker (user_id) en query (query_id).

Naam Type Naslaginformatie Beschrijving
runtime_stats_entry_id bigint Id uit de runtime_stats_entries tabel.
user_id oid pg_authid.oid OID van de gebruiker die de instructie heeft uitgevoerd.
db_id oid pg_database.oid OID van de database waarin de instructie is uitgevoerd.
query_id bigint Interne hashcode, berekend op basis van de parseringsstructuur van de instructie.
query_sql_text varchar(10000) Tekst van een representatieve verklaring. Verschillende query's met dezelfde structuur worden samen geclusterd; deze tekst is de tekst voor de eerste van de query's in het cluster. De standaardwaarde voor de maximale lengte van querytekst is 6000 en kan worden gewijzigd met de query store-parameter pg_qs.max_query_text_length. Als de tekst van de query deze maximumwaarde overschrijdt, wordt deze afgekapt tot de eerste pg_qs.max_query_text_length bytes.
plan_id bigint Id van het plan dat overeenkomt met deze query.
start_time timestamp Query's worden geaggregeerd op tijdvensters. De serverparameter pg_qs.interval_length_minutes definieert de tijdsduur van deze vensters (standaard is 15 minuten). Deze kolom komt overeen met de begintijd van het venster waarin deze vermelding is vastgelegd.
end_time timestamp Eindtijd die overeenkomt met het tijdvenster voor deze vermelding.
calls bigint Aantal keren dat de query in dit tijdvenster wordt uitgevoerd. U ziet dat voor parallelle query's het aantal aanroepen voor elke uitvoering overeenkomt met 1 voor het back-endproces dat de uitvoering van de query aanstuurt, plus net zoveel andere eenheden voor elk back-endwerkrolproces dat wordt gestart om samen te werken met de parallelle vertakkingen van de uitvoeringsstructuur.
total_time dubbele precisie Totale uitvoeringstijd van query's, in milliseconden.
min_time dubbele precisie Minimale uitvoeringstijd van query's, in milliseconden.
max_time dubbele precisie Maximale uitvoeringstijd van query's, in milliseconden.
mean_time dubbele precisie Gemiddelde uitvoeringstijd van query's, in milliseconden.
stddev_time dubbele precisie Standaarddeviatie van de uitvoeringstijd van de query, in milliseconden.
rows bigint Het totale aantal rijen dat is opgehaald of beïnvloed door de instructie. Voor parallelle query's komt het aantal rijen voor elke uitvoering overeen met het aantal rijen dat wordt geretourneerd aan de client door het back-endproces dat de uitvoering van de query aanstuurt, plus de som van alle rijen die elk back-endwerkproces hebben gestart om samen te werken aan het uitvoeren van de parallelle vertakkingen van de uitvoeringsstructuur, terug naar het back-endproces dat de uitvoering van de query aanstuurt.
shared_blks_hit bigint Het totale aantal gedeelde blokcachetreffers door de instructie.
shared_blks_read bigint Het totale aantal gedeelde blokken dat door de instructie is gelezen.
shared_blks_dirtied bigint Het totale aantal gedeelde blokken dat door de instructie wordt veroorzaakt.
shared_blks_written bigint Het totale aantal gedeelde blokken dat door de instructie is geschreven.
local_blks_hit bigint Totaal aantal lokale blokcachetreffers door de instructie.
local_blks_read bigint Het totale aantal lokale blokken dat door de instructie is gelezen.
local_blks_dirtied bigint Het totale aantal lokale blokken dat door de instructie wordt veroorzaakt.
local_blks_written bigint Totaal aantal lokale blokken dat door de instructie is geschreven.
temp_blks_read bigint Totaal aantal tijdelijke blokken dat door de instructie wordt gelezen.
temp_blks_written bigint Totaal aantal tijdelijke blokken dat door de instructie is geschreven.
blk_read_time dubbele precisie Totale tijd die de instructie heeft besteed aan leesblokken, in milliseconden (als track_io_timing is ingeschakeld, anders nul).
blk_write_time dubbele precisie Totale tijd die de instructie heeft besteed aan het schrijven van blokken, in milliseconden (als track_io_timing is ingeschakeld, anders nul).
is_system_query boolean Bepaalt of de rol met user_id = 10 (azuresu) de query heeft uitgevoerd. Deze gebruiker heeft supergebruikersbevoegdheden en wordt gebruikt om besturingsvlakbewerkingen uit te voeren. Omdat deze service een beheerde PaaS-service is, maakt alleen Microsoft deel uit van die supergebruikerrol.
query_type sms verzenden Type bewerking dat wordt vertegenwoordigd door de query. Mogelijke waarden zijnunknown, select, update, , insert, delete, merge, utility, , nothing. undefined
search_path sms verzenden De waarde van search_path ingesteld op het moment dat de query is vastgelegd.
query_parameters sms verzenden Tekstweergave van een JSON-object met de waarden die worden doorgegeven aan de positionele parameters van een geparameteriseerde query. In deze kolom wordt alleen de waarde in twee gevallen ingevuld: 1) voor niet-geparameteriseerde query's. 2) Voor geparameteriseerde query's, wanneer pg_qs.parameters_capture_mode deze is ingesteld capture_first_sampleop en als het queryarchief de waarden voor de parameters van de query tijdens de uitvoering kan ophalen.
parameters_capture_status sms verzenden Type bewerking dat wordt vertegenwoordigd door de query. Mogelijke waarden zijn (de query is succeeded niet geparameteriseerd of het was een geparameteriseerde query en waarden zijn vastgelegd), disabled (query is geparameteriseerd, maar parameters zijn niet vastgelegd omdat pg_qs.parameters_capture_mode deze is ingesteld capture_parameterless_onlyop ), too_long_to_capture (query is geparameteriseerd, maar parameters zijn niet vastgelegd omdat de lengte van de resulterende JSON die in de query_parameters kolom van deze weergave zou worden weergegeven, te lang werd beschouwd voor het opslaan van query's), too_many_to_capture (query is geparameteriseerd, maar parameters zijn niet vastgelegd omdat het totale aantal parameters als overmatig werd beschouwd voor het opslaan van query's), serialization_failed (query is geparameteriseerd, maar ten minste één van de waarden die als parameter zijn doorgegeven, kan niet worden geserialiseerd naar tekst).

query_store.query_texts_view

Deze weergave retourneert querytekstgegevens in Query Store. Er is één rij voor elke afzonderlijke query_sql_text.

Naam Type Beschrijving
query_text_id bigint Id voor de query_texts tabel
query_sql_text varchar(10000) Tekst van een representatieve verklaring. Verschillende query's met dezelfde structuur worden samen geclusterd; deze tekst is de tekst voor de eerste van de query's in het cluster.
query_type smallint Type bewerking dat wordt vertegenwoordigd door de query. In versie van PostgreSQL <= 14 zijn 0 mogelijke waarden (onbekend), 1 (select), 2 (update), (insert), 3 4 (delete), (utility), 5 6 (niets). In versie van PostgreSQL >= 15 zijn 0 mogelijke waarden (onbekend), 1 (select), 2 (update), (invoegen), 3 4 (verwijderen), (samenvoegen), 5 6 (hulpprogramma), 7 (niets).

query_store.pgms_wait_sampling_view

Deze weergave retourneert wacht gebeurtenisgegevens in Query Store. Deze weergave retourneert een andere rij voor elke afzonderlijke database (db_id), gebruiker (user_id), query (query_id) en gebeurtenis (gebeurtenis).

Naam Type Naslaginformatie Beschrijving
start_time timestamp Query's worden geaggregeerd op tijdvensters. De serverparameter pg_qs.interval_length_minutes definieert de tijdsduur van deze vensters (standaard is 15 minuten). Deze kolom komt overeen met de begintijd van het venster waarin deze vermelding is vastgelegd.
end_time timestamp Eindtijd die overeenkomt met het tijdvenster voor deze vermelding.
user_id oid pg_authid.oid Object-id van de gebruiker die de instructie heeft uitgevoerd.
db_id oid pg_database.oid Object-id van database waarin de instructie is uitgevoerd.
query_id bigint Interne hashcode, berekend op basis van de parseringsstructuur van de instructie.
event_type sms verzenden Het type gebeurtenis waarvoor de back-end wacht.
event sms verzenden De naam van de wacht gebeurtenis als de back-end momenteel wacht.
calls geheel getal Aantal keren dat dezelfde gebeurtenis is vastgelegd.

Notitie

Raadpleeg de officiële documentatie van pg_stat_activity voor een lijst met mogelijke waarden in de event_type weergave en event query_store.pgms_wait_sampling_view zoek naar de informatie die verwijst naar kolommen met dezelfde namen.

query_store.query_plans_view

Deze weergave retourneert het queryplan dat is gebruikt om een query uit te voeren. Er is één rij per afzonderlijke database-id en query-id. Query store registreert alleen queryplannen voor niet-gebruikte query's.

Naam Type Naslaginformatie Beschrijving
plan_id bigint De hashwaarde van het genormaliseerde queryplan dat wordt geproduceerd door EXPLAIN. Het is in genormaliseerde vorm omdat het de geschatte kosten van planknooppunten en het gebruik van buffers uitsluit.
db_id oid pg_database.oid OID van de database waarin de instructie is uitgevoerd.
query_id bigint Interne hashcode, berekend op basis van de parseringsstructuur van de instructie.
plan_text varchar(10000) Uitvoeringsplan van de instructie opgegeven kosten=false, buffers=false en format=text. Identieke uitvoer als de uitvoer die door EXPLAIN wordt geproduceerd.

Functies

query_store.qs_reset

Met deze functie worden alle statistieken verwijderd die tot nu toe zijn verzameld door het queryarchief. Hiermee worden de statistieken voor reeds gesloten tijdvensters verwijderd, die al zijn persistent voor tabellen op schijf. Ook worden de statistieken voor het huidige tijdvenster verwijderd, die alleen in het geheugen aanwezig zijn. Alleen leden van de serverbeheerderrol (azure_pg_admin) kunnen deze functie uitvoeren.

query_store.staging_data_reset

Met deze functie worden alle statistieken die in het geheugen zijn verzameld door het queryarchief verwijderd (dat wil gezegd, de gegevens in het geheugen die nog niet zijn leeggemaakt naar de schijftabellen die persistentie van verzamelde gegevens voor het queryarchief ondersteunen). Alleen leden van de serverbeheerderrol (azure_pg_admin) kunnen deze functie uitvoeren.

Modus Alleen-lezen

Wanneer een exemplaar van Azure Database for PostgreSQL Flexible Server zich in de modus Alleen-lezen bevindt, zoals wanneer de default_transaction_read_only parameter is ingesteld onop, of als de modus Alleen-lezen automatisch wordt ingeschakeld vanwege het bereiken van de opslagcapaciteit, worden er geen gegevens vastgelegd in het queryarchief.

Als u het queryarchief inschakelt op een server met leesreplica's, wordt het queryarchief niet automatisch ingeschakeld op een van de leesreplica's. Zelfs als u deze inschakelt op een van de leesreplica's, worden de query's die worden uitgevoerd op leesreplica's niet opgeslagen in de modus Alleen-lezen, omdat ze worden uitgevoerd in de modus Alleen-lezen totdat u ze promoveert naar primair.

Deel uw suggesties en bugs met het productteam van Azure Database for PostgreSQL.