Indexafstemming in Azure Database for PostgreSQL - Flexibele server
VAN TOEPASSING OP: Azure Database for PostgreSQL - Flexibele server
Indexafstemming is een functie in flexibele Azure Database for PostgreSQL-server waarmee de prestaties van uw workload automatisch worden verbeterd door de bijgehouden query's te analyseren en indexaan aanbevelingen te geven.
Het is een ingebouwde aanbieding in azure Database for PostgreSQL flexibele server, die voortbouwt op de prestaties van de monitor met querystore-functionaliteit . Indexafstemming analyseert de workload die wordt bijgehouden door het queryarchief en produceert indexaankopen om de prestaties van de geanalyseerde workload te verbeteren of dubbele of ongebruikte indexen te verwijderen.
- Bepaal welke indexen nuttig zijn om te maken, omdat ze de query's die tijdens een sessie voor het afstemmen van de index worden geanalyseerd aanzienlijk kunnen verbeteren.
- Identificeer indexen die exacte duplicaten zijn en kunnen worden geëlimineerd om de prestaties te verminderen die hun bestaan en onderhoud hebben op de algehele prestaties van het systeem.
- Identificeer indexen die niet worden gebruikt in een configureerbare periode die kandidaten kunnen zijn om te elimineren.
Algemene beschrijving van het algoritme voor indexafstemming
Wanneer de index_tuning.mode
serverparameter is geconfigureerd report
, worden afstemmingssessies automatisch gestart met de frequentie die is geconfigureerd in de serverparameter index_tuning.analysis_interval
, uitgedrukt in minuten.
In de eerste fase zoekt de afstemmingssessie naar de lijst met databases waarin wordt gekeken of de aanbevelingen die het kan produceren, van invloed kunnen zijn op de algehele prestaties van het systeem. Hiervoor worden alle query's verzameld die zijn vastgelegd door het queryarchief waarvan de uitvoeringen zijn vastgelegd binnen het opzoekinterval waarop deze afstemmingssessie zich richt. Het opzoekinterval duurt momenteel tot de afgelopen index_tuning.analysis_interval
minuten, vanaf de begintijd van de afstemmingssessie.
Voor alle door de gebruiker geïnitieerde query's met uitvoeringen die zijn vastgelegd in het queryarchief en waarvan de runtimestatistieken niet opnieuw worden ingesteld, rangschikt het systeem deze op basis van de geaggregeerde totale uitvoeringstijd. Het richt zich op de meest prominente query's, op basis van hun duur.
De volgende query's worden uitgesloten van die lijst:
- Door het systeem geïnitieerde query's. (dat wil gezegd, query's uitgevoerd op
azuresu
rol) - Query's die worden uitgevoerd in de context van een systeemdatabase (
azure_sys
,template0
,template1
enazure_maintenance
).
Het algoritme doorloopt de doeldatabases en zoekt naar mogelijke indexen die de prestaties van geanalyseerde workloads kunnen verbeteren. Er wordt ook gezocht naar indexen die kunnen worden geëlimineerd omdat ze worden geïdentificeerd als duplicaten of niet worden gebruikt voor een configureerbare periode.
AANBEVELINGEN VOOR CREATE INDEX
Voor elke database die is geïdentificeerd als kandidaat om te analyseren voor het produceren van indexaankopen, worden alle SELECT-, UPDATE-, INSERT- en DELETE-query's uitgevoerd tijdens het opzoekinterval en in de context van die specifieke database opgenomen.
Notitie
Indexafstemming analyseert niet alleen SELECT-instructies, maar ook DML-instructies (UPDATE, INSERT en DELETE).
De resulterende set query's wordt gerangschikt op basis van de geaggregeerde totale uitvoeringstijd en de top index_tuning.max_queries_per_database
wordt geanalyseerd op mogelijke indexaan aanbevelingen.
Mogelijke aanbevelingen zijn gericht op het verbeteren van de prestaties van deze typen query's:
- Query's met filters (dat wil gezegd, query's met predicaten in de WHERE-component),
- Query's die meerdere relaties samenvoegen, of ze nu de syntaxis volgen waarin joins worden uitgedrukt met JOIN-component of of de joinpredicaten worden uitgedrukt in de WHERE-component.
- Query's combineren filters en joinpredicaten.
- Query's met groepering (query's met een GROUP BY-component).
- Query's waarbij filters en groepering worden gecombineerd.
- Query's met sortering (query's met een ORDER BY-component).
- Query's combineren filters en sorteren.
Notitie
Het enige type indexen dat het systeem momenteel aanbeveelt, zijn die van het type B-Tree.
Als een query verwijst naar één kolom van een tabel en die tabel geen statistieken heeft, wordt de hele query overgeslagen en worden er geen indexaanaanvelingen geproduceerd om de uitvoering te verbeteren.
Analyse die nodig is om statistieken te verzamelen, kan handmatig worden geactiveerd met behulp van de opdracht ANALYZE of automatisch door de autovacuum-daemon.
index_tuning.max_indexes_per_table
geeft het aantal indexen op dat kan worden aanbevolen, met uitzondering van indexen die al in de tabel aanwezig kunnen zijn voor elke tabel waarnaar wordt verwezen door een willekeurig aantal query's tijdens een afstemmingssessie.
index_tuning.max_index_count
geeft het aantal indexaankopen op dat wordt geproduceerd voor alle tabellen van elke database die tijdens een afstemmingssessie wordt geanalyseerd.
Om een indexaanveling uit te voeren, moet de afstemmingsengine schatten dat deze ten minste één query in de geanalyseerde workload verbetert met een factor die is opgegeven met index_tuning.min_improvement_factor
.
Op dezelfde manier worden alle indexaanbeveling gecontroleerd om ervoor te zorgen dat ze geen regressie introduceren voor één query in die workload van een factor die is opgegeven met index_tuning.max_regression_factor
.
Notitie
index_tuning.min_improvement_factor
en index_tuning.max_regression_factor
beide verwijzen naar de kosten van queryplannen, niet naar hun duur of de resources die ze tijdens de uitvoering gebruiken.
Alle parameters die in de vorige alinea's worden genoemd, worden hun standaardwaarden en geldige bereiken beschreven in configuratieopties.
Het script dat samen met de aanbeveling voor het maken van een index wordt geproduceerd, volgt dit patroon:
create index concurrently {indexName} on {schema}.{table}({column_name}[, ...])
Het bevat de component concurrently
. Ga naar de officiële documentatie van PostgreSQL voor CREATE INDEX voor meer informatie over de effecten van deze component.
Indexafstemming genereert automatisch de namen van de aanbevolen indexen, die doorgaans bestaan uit de namen van de verschillende sleutelkolommen, gescheiden door '_' (onderstrepingstekens) en met een constant achtervoegsel '_idx'. Als de totale lengte van de naam de Limieten van PostgreSQL overschrijdt of als deze conflicteert met bestaande relaties, is de naam iets anders. Het kan worden afgekapt en er kan een getal worden toegevoegd aan het einde van de naam.
De impact van een AANBEVELING CREATE INDEX berekenen
De impact van het maken van een indexaanbeveling wordt gemeten op IndexSize (megabytes) en QueryCostImprovement (percentage).
IndexSize is één waarde die de geschatte grootte van de index aangeeft, rekening houdend met de huidige kardinaliteit van de tabel en de grootte van de kolommen waarnaar wordt verwezen door de aanbevolen index.
QueryCostImprovement bestaat uit een matrix met waarden, waarbij elk element de verbetering van de kosten van het plan vertegenwoordigt voor elke query waarvan de kosten van het plan naar schatting worden verbeterd als deze index bestaat. Elk element toont de id van de query (opgevraagd) en het percentage waarmee de kosten van het plan zouden worden verbeterd als de aanbeveling werd geïmplementeerd (dimensional).
AANBEVELINGEN VOOR DROP INDEX en REINDEX
Voor elke database waarvoor de functionaliteit voor indexafstemming wordt bepaald, moet er een nieuwe sessie worden gestart. Nadat de fase CREATE INDEX-aanbevelingen is voltooid, wordt u aangeraden bestaande indexen te verwijderen of opnieuw te indexeren op basis van de volgende criteria:
- Neerzetten als het wordt beschouwd als duplicaat van anderen.
- Neerzetten als deze niet wordt gebruikt voor een configureerbare hoeveelheid tijd.
- Indexen die als ongeldig zijn gemarkeerd, opnieuw indexeren.
Dubbele indexen verwijderen
Aanbevelingen voor het verwijderen van dubbele indexen: bepaal eerst welke indexen dubbele waarden hebben.
Duplicaten worden gerangschikt op basis van verschillende functies die kunnen worden toegeschreven aan de index en op basis van hun geschatte grootten.
Ten slotte wordt aanbevolen om alle duplicaten met een lagere classificatie te verwijderen dan de verwijzingsleider en beschrijft waarom elke duplicaat op de manier is gerangschikt zoals het was.
Twee indexen moeten als duplicaat worden beschouwd:
- U kunt deze maken via dezelfde tabel.
- Wees een index van hetzelfde type.
- Komen overeen met de sleutelkolommen en komen voor indexsleutels met meerdere kolommen overeen met de volgorde waarnaar wordt verwezen.
- Komt overeen met de expressiestructuur van het predicaat. Alleen van toepassing op gedeeltelijke indexen.
- Komt overeen met de expressiestructuur van alle niet-simple kolomverwijzingen. Alleen van toepassing op indexen die zijn gemaakt op expressies.
- Komt overeen met de sortering van elke kolom waarnaar in de sleutel wordt verwezen.
Ongebruikte indexen verwijderen
Aanbevelingen voor het verwijderen van ongebruikte indexen identificeren de indexen die:
- Worden ten minste
index_tuning.unused_min_period
dagen niet gebruikt. - Geef een minimumaantal
index_tuning.unused_dml_per_table
(dagelijks gemiddelde) DML's weer in de tabel waarin de index wordt gemaakt. - Een minimumaantal
index_tuning.unused_reads_per_table
leesbewerkingen (dagelijks gemiddelde) weergeven in de tabel waarin de index wordt gemaakt.
Ongeldige indexen opnieuw indexeren
Aanbevelingen voor het opnieuw indexeren van bestaande indexen identificeren de indexen die als ongeldig zijn gemarkeerd. Raadpleeg de officiële documentatie van REINDEX in PostgreSQL voor meer informatie over waarom en wanneer indexen als ongeldig zijn gemarkeerd.
De impact van een DROP INDEX-aanbeveling berekenen
De impact van een aanbeveling voor een dalingsindex wordt gemeten op twee dimensies: Benefit (percentage) en IndexSize (megabytes).
Het voordeel is één waarde die voorlopig kan worden genegeerd.
IndexSize is één waarde die de geschatte grootte van de index aangeeft, rekening houdend met de huidige kardinaliteit van de tabel en de grootte van de kolommen waarnaar wordt verwezen door de aanbevolen index.
Indexafstemming configureren
Indexafstemming kan worden ingeschakeld, uitgeschakeld en geconfigureerd via een set parameters die het gedrag ervan bepalen, zoals hoe vaak een afstemmingssessie kan worden uitgevoerd.
Bekijk alle details over de juiste configuratie van de functie voor indexafstemming voor het inschakelen, uitschakelen en configureren van indexafstemming.
Informatie geproduceerd door indexafstemming
Het lezen, interpreteren en gebruiken van aanbevelingen die door indexafstemming worden geproduceerd, beschrijft in detail hoe u de aanbevelingen kunt verkrijgen en gebruiken die worden geproduceerd door indexafstemming.
Beperkingen en ondersteuning
Hieronder vindt u de lijst met beperkingen en ondersteuningsbereik voor het afstemmen van indexen.
Ondersteunde rekenlagen en SKU's
Indexafstemming wordt ondersteund voor alle momenteel beschikbare lagen: Burstable, Algemeen gebruik en Geoptimaliseerd voor geheugen, en op elke momenteel ondersteunde reken-SKU met ten minste 4 vCores.
Ondersteunde versies van PostgreSQL
Indexafstemming wordt ondersteund in primaire versies 12 of hoger van Azure Database for PostgreSQL Flexible Server.
Gebruik van search_path
Indexafstemming verbruikt de waarde die behouden blijft in de kolom search_path
van query_store.qs_view, zodat wanneer elke query wordt geanalyseerd, dezelfde waarde is search_path
ingesteld toen de query oorspronkelijk werd uitgevoerd, de waarde is waarop de query oorspronkelijk is ingesteld om mogelijke aanbevelingen te analyseren.
Geparameteriseerde query's
Geparameteriseerde query's die zijn gemaakt met PREPARE of met behulp van het uitgebreide queryprotocol , worden geparseerd en geanalyseerd om er indexaanaankopen op te maken.
Voor de analyse van geparameteriseerde query's is voor indexafstemming vereist dat pg_qs.parameters_capture_mode is ingesteld capture_first_sample
op wanneer het queryarchief de uitvoering van de query vastlegt. Het vereist ook dat de parameters correct worden vastgelegd door het queryarchief wanneer de query wordt uitgevoerd. Met andere woorden, voor de query die wordt geanalyseerd, moet query_store.qs_view de kolom parameters_capture_status
hebben ingesteld op succeeded
.
Modus Alleen-lezen en leesreplica's
Omdat het afstemmen van indexen afhankelijk is van het queryarchief, dat niet wordt ondersteund in leesreplica's of wanneer een exemplaar zich in de modus Alleen-lezen bevindt, wordt dit niet ondersteund op leesreplica's of op exemplaren die zich in de modus Alleen-lezen bevinden.
Eventuele aanbevelingen voor een leesreplica zijn geproduceerd op de primaire replica nadat ze uitsluitend de workload hebben geanalyseerd die op de primaire replica is uitgevoerd.
Omlaag schalen van rekenkracht
Als indexafstemming is ingeschakeld op een server en u de rekenkracht van die server omlaag schaalt naar minder dan het minimale aantal vereiste vCores, blijft de functie ingeschakeld. Omdat de functie niet wordt ondersteund op servers met minder dan 4 vCores, wordt deze niet uitgevoerd om de workload te analyseren en aanbevelingen te produceren, zelfs niet als deze is ingesteld ON
op het moment dat index_tuning.mode
de berekening omlaag is geschaald. Hoewel de server niet voldoet aan de minimale vereisten, zijn alle index_tuning.*
serverparameters niet toegankelijk. Wanneer u uw server weer schaalt naar een berekening die voldoet aan de minimale vereisten, index_tuning.mode
wordt geconfigureerd met de waarde die is ingesteld voordat u deze omlaag schaalde naar een berekening die niet aan de vereisten voldoet.
Hoge beschikbaarheid en leesreplica's
Als u hoge beschikbaarheid of leesreplica's hebt geconfigureerd op uw server, moet u rekening houden met de gevolgen voor het produceren van schrijfintensieve werkbelastingen op de primaire server bij het implementeren van de aanbevolen indexen. Wees vooral voorzichtig bij het maken van indexen waarvan de grootte naar schatting groot is.