Problemen met hoog CPU-gebruik in Azure SQL Database vaststellen en oplossen
Van toepassing op: Azure SQL Database
Azure SQL Database biedt ingebouwde hulpprogramma's om de oorzaken van hoog CPU-gebruik te identificeren en de prestaties van workloads te optimaliseren. U kunt deze hulpprogramma's gebruiken om problemen met hoog CPU-gebruik op te lossen tijdens het optreden, of reactief nadat het incident is voltooid. U kunt ook automatisch afstemmen inschakelen om het CPU-gebruik in de loop van de tijd voor uw database proactief te verminderen. In dit artikel leert u hoe u een hoge CPU kunt vaststellen en oplossen met ingebouwde hulpprogramma's in Azure SQL Database en wordt uitgelegd wanneer u CPU-resources toevoegt.
Inzicht in het aantal vCores
Het is handig om inzicht te hebben in het aantal virtuele kernen (vCores) dat beschikbaar is voor uw database bij het diagnosticeren van een hoog CPU-incident. Een vCore is gelijk aan een logische CPU. Het aantal vCores helpt u inzicht te krijgen in de CPU-resources die beschikbaar zijn voor uw database.
Aantal vCores identificeren in Azure Portal
U kunt snel het aantal vCores voor een database in Azure Portal identificeren als u een vCore-servicelaag gebruikt met de ingerichte rekenlaag. In dit geval bevat de prijscategorie die wordt vermeld voor de database op de overzichtspagina het aantal vCores. De prijscategorie van een database kan bijvoorbeeld 'Algemeen gebruik: Standard-serie (Gen5), 16 vCores' zijn.
Voor databases in de serverloze rekenlaag is het aantal vCores altijd gelijk aan de maximale vCore-instelling voor de database. Het aantal VCores wordt weergegeven in de prijscategorie die wordt vermeld voor de database op de overzichtspagina. De prijscategorie van een database kan bijvoorbeeld 'Algemeen gebruik: Serverloze, Standard Series (Gen5), 16 vCores' zijn.
Als u een database gebruikt onder het aankoopmodel op basis van DTU, moet u Transact-SQL gebruiken om een query uit te voeren op het aantal vCores van de database.
Aantal vCores identificeren met Transact-SQL
U kunt het huidige aantal vCores voor elke database met Transact-SQL identificeren. U kunt Transact-SQL uitvoeren op Azure SQL Database met SQL Server Management Studio (SSMS), Azure Data Studio of de Query-editor van Azure Portal.
Verbinding maken naar uw database en voer de volgende query uit:
SELECT
COUNT(*) as vCores
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE';
GO
De oorzaken van een hoog CPU-gebruik identificeren
U kunt het CPU-gebruik meten en analyseren met behulp van de Azure-portal, interactieve hulpprogramma's van Query Store in SSMS en Transact-SQL-query's in SSMS en Azure Data Studio.
In Azure Portal en Query Store worden uitvoeringsstatistieken weergegeven, zoals metrische CPU-gegevens, voor voltooide query's. Als u een actueel hoog CPU-incident ondervindt dat mogelijk wordt veroorzaakt door een of meer lopende langlopende query's, identificeert u momenteel actieve query's met Transact-SQL.
Veelvoorkomende oorzaken van een nieuw en ongebruikelijk hoog CPU-gebruik zijn:
- Nieuwe query's in de workload die een grote hoeveelheid CPU gebruiken.
- Een toename van de frequentie van het regelmatig uitvoeren van query's.
- Regressie van queryplannen, inclusief regressie vanwege problemen met parametergevoelig plan (PSP), wat resulteert in een of meer query's die meer CPU verbruiken.
- Een aanzienlijke toename van de compilatie of hercompilatie van queryplannen.
- Databases waarin query's overmatige parallelle uitvoering gebruiken.
Als u wilt weten wat uw hoge CPU-incident veroorzaakt, identificeert u wanneer er een hoog CPU-gebruik plaatsvindt voor uw database en de belangrijkste query's die gebruikmaken van CPU op dat moment.
Onderzoeken:
- Worden er nieuwe query's met een aanzienlijk CPU-gebruik weergegeven in de workload of ziet u een toename van de frequentie van regelmatig uitgevoerde query's? Gebruik een van de volgende methoden om te onderzoeken. Zoek naar query's met een beperkte geschiedenis (nieuwe query's) en met de frequentie van uitvoering voor query's met een langere geschiedenis.
- Gebruiken sommige query's in de workload meer CPU per uitvoering dan in het verleden? Zo ja, is het uitvoeringsplan van de query gewijzigd? Deze query's kunnen problemen hebben met het parametergevoelige plan (PSP). Gebruik een van de volgende technieken om te onderzoeken. Zoek naar query's met meerdere queryuitvoeringsplannen met een aanzienlijke variatie in CPU-gebruik:
- Is er bewijs van een grote hoeveelheid compilatie of hercompilatie? Voer een query uit op de meest vaak gecompileerde query's per query-hash en controleer hoe vaak ze worden gecompileerd.
- Worden query's overmatig parallellisme gebruikt? Voer een query uit op de configuratie van uw MAXDOP-databasebereik en controleer het aantal vCores. Overmatige parallelle uitvoering vindt vaak plaats in databases waarop MAXDOP is ingesteld
0
op een vCore-telling die hoger is dan acht.
Notitie
Azure SQL Database vereist rekenresources om kernservicefuncties te implementeren, zoals hoge beschikbaarheid en herstel na noodgevallen, back-up en herstel van databases, bewaking, Query Store, automatisch afstemmen, enzovoort. Het gebruik van deze rekenresources kan met name merkbaar zijn voor databases met een laag aantal vCores of databases in dichte elastische pools. Meer informatie over resourcebeheer in Azure SQL Database.
Metrische gegevens over CPU-gebruik en gerelateerde topquery's bekijken in Azure Portal
Gebruik Azure Portal om verschillende CPU-metrische gegevens bij te houden, inclusief het percentage beschikbare CPU dat in de loop van de tijd door uw database wordt gebruikt. De Azure-portal combineert cpu-metrische gegevens met informatie uit de Query Store van uw database, waarmee u kunt bepalen welke query's de CPU in uw database op een bepaald moment verbruiken.
Volg deze stappen om metrische gegevens van het CPU-percentage te vinden.
- Navigeer naar de database in Azure Portal.
- Selecteer onder Intelligent Performance In het linkermenu Query Performance Insight.
In de standaardweergave van Query Performance Insight worden 24 uur aan gegevens weergegeven. CPU-gebruik wordt weergegeven als een percentage van het totale beschikbare CPU-gebruik voor de database.
De vijf belangrijkste query's die in die periode worden uitgevoerd, worden weergegeven in verticale balken boven de grafiek cpu-gebruik. Selecteer een tijdsband in de grafiek of gebruik het menu Aanpassen om specifieke perioden te verkennen. U kunt ook het aantal weergegeven query's verhogen.
Selecteer elke query-id met een hoog CPU-gebruik om details voor de query te openen. Details omvatten querytekst samen met prestatiegeschiedenis voor de query. Controleer of de CPU onlangs is toegenomen voor de query.
Noteer de query-id om het queryplan verder te onderzoeken met behulp van Query Store in de volgende sectie.
Queryplannen bekijken voor de belangrijkste query's die zijn geïdentificeerd in Azure Portal
Volg deze stappen om een query-id te gebruiken in de interactieve Query Store-hulpprogramma's van SSMS om het uitvoeringsplan van de query in de loop van de tijd te onderzoeken.
- Open SQL Server Management Studio.
- Verbinding maken naar uw Azure SQL Database in Objectverkenner.
- Vouw het databaseknooppunt uit in Objectverkenner.
- Vouw de map Query Store uit.
- Open het deelvenster Bijgehouden query's .
- Voer de query-id in het vak Traceringsquery linksboven in het scherm in en druk op Enter.
- Selecteer indien nodig Configureren om het tijdsinterval aan te passen aan de tijd waarop hoog CPU-gebruik plaatsvond.
Op de pagina worden de uitvoeringsplan(en) en gerelateerde metrische gegevens voor de query weergegeven gedurende de afgelopen 24 uur.
Momenteel uitgevoerde query's identificeren met Transact-SQL
Met Transact-SQL kunt u momenteel actieve query's identificeren met de CPU-tijd die ze tot nu toe hebben gebruikt. U kunt Transact-SQL ook gebruiken om een query uit te voeren op recent CPU-gebruik in uw database, topquery's per CPU en query's die het vaakst zijn gecompileerd.
U kunt query's uitvoeren op metrische CPU-gegevens met BEHULP van SQL Server Management Studio (SSMS), Azure Data Studio of de query-editor van Azure Portal. Wanneer u SSMS of Azure Data Studio gebruikt, opent u een nieuw queryvenster en verbindt u dit met uw database (niet de master
database).
Zoek momenteel actieve query's met CPU-gebruiks- en uitvoeringsplannen door de volgende query uit te voeren. DE CPU-tijd wordt geretourneerd in milliseconden.
SELECT
req.session_id,
req.status,
req.start_time,
req.cpu_time AS 'cpu_time_ms',
req.logical_reads,
req.dop,
s.login_name,
s.host_name,
s.program_name,
object_name(st.objectid,st.dbid) 'ObjectName',
REPLACE (REPLACE (SUBSTRING (st.text,(req.statement_start_offset/2) + 1,
((CASE req.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE req.statement_end_offset END - req.statement_start_offset)/2) + 1),
CHAR(10), ' '), CHAR(13), ' ') AS statement_text,
qp.query_plan,
qsx.query_plan as query_plan_with_in_flight_statistics
FROM sys.dm_exec_requests as req
JOIN sys.dm_exec_sessions as s on req.session_id=s.session_id
CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as st
OUTER APPLY sys.dm_exec_query_plan(req.plan_handle) as qp
OUTER APPLY sys.dm_exec_query_statistics_xml(req.session_id) as qsx
ORDER BY req.cpu_time desc;
GO
Deze query retourneert twee kopieën van het uitvoeringsplan. De kolom query_plan
bevat het uitvoeringsplan van sys.dm_exec_query_plan. Deze versie van het queryplan bevat alleen schattingen van het aantal rijen en bevat geen uitvoeringsstatistieken.
Als de kolom query_plan_with_in_flight_statistics
een uitvoeringsplan retourneert, biedt dit plan meer informatie. De query_plan_with_in_flight_statistics
kolom retourneert gegevens uit sys.dm_exec_query_statistics_xml, waaronder uitvoeringsstatistieken 'in vlucht', zoals het werkelijke aantal rijen dat tot nu toe is geretourneerd door een query die momenteel wordt uitgevoerd.
Metrische gegevens over CPU-gebruik voor het afgelopen uur bekijken
De volgende query retourneert sys.dm_db_resource_stats
het gemiddelde CPU-gebruik gedurende ongeveer het afgelopen uur gedurende ongeveer het afgelopen uur.
SELECT
end_time,
avg_cpu_percent,
avg_instance_cpu_percent
FROM sys.dm_db_resource_stats
ORDER BY end_time DESC;
GO
Het is belangrijk dat u zich niet alleen op de avg_cpu_percent
kolom richt. De avg_instance_cpu_percent
kolom bevat CPU die wordt gebruikt door zowel gebruikers- als interne workloads. Als avg_instance_cpu_percent
dit bijna 100% is, zijn CPU-resources verzadigd. In dit geval moet u problemen met een hoge CPU oplossen als de doorvoer van apps onvoldoende is of de querylatentie hoog is.
Meer informatie over resourcebeheer in Azure SQL Database.
Bekijk de voorbeelden in sys.dm_db_resource_stats voor meer query's.
Query's uitvoeren op de 15 meest recente query's op basis van CPU-gebruik
Query Store houdt uitvoeringsstatistieken bij, inclusief CPU-gebruik, voor query's. De volgende query retourneert de top 15 query's die in de afgelopen 2 uur zijn uitgevoerd, gesorteerd op CPU-gebruik. DE CPU-tijd wordt geretourneerd in milliseconden.
WITH AggregatedCPU AS
(SELECT
q.query_hash,
SUM(count_executions * avg_cpu_time / 1000.0) AS total_cpu_ms,
SUM(count_executions * avg_cpu_time / 1000.0)/ SUM(count_executions) AS avg_cpu_ms,
MAX(rs.max_cpu_time / 1000.00) AS max_cpu_ms,
MAX(max_logical_io_reads) max_logical_reads,
COUNT(DISTINCT p.plan_id) AS number_of_distinct_plans,
COUNT(DISTINCT p.query_id) AS number_of_distinct_query_ids,
SUM(CASE WHEN rs.execution_type_desc='Aborted' THEN count_executions ELSE 0 END) AS aborted_execution_count,
SUM(CASE WHEN rs.execution_type_desc='Regular' THEN count_executions ELSE 0 END) AS regular_execution_count,
SUM(CASE WHEN rs.execution_type_desc='Exception' THEN count_executions ELSE 0 END) AS exception_execution_count,
SUM(count_executions) AS total_executions,
MIN(qt.query_sql_text) AS sampled_query_text
FROM sys.query_store_query_text AS qt
JOIN sys.query_store_query AS q ON qt.query_text_id=q.query_text_id
JOIN sys.query_store_plan AS p ON q.query_id=p.query_id
JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id=p.plan_id
JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id=rs.runtime_stats_interval_id
WHERE
rs.execution_type_desc IN ('Regular', 'Aborted', 'Exception') AND
rsi.start_time>=DATEADD(HOUR, -2, GETUTCDATE())
GROUP BY q.query_hash),
OrderedCPU AS
(SELECT *,
ROW_NUMBER() OVER (ORDER BY total_cpu_ms DESC, query_hash ASC) AS RN
FROM AggregatedCPU)
SELECT *
FROM OrderedCPU AS OD
WHERE OD.RN<=15
ORDER BY total_cpu_ms DESC;
GO
Deze query wordt gegroepeerd op een gehashte waarde van de query. Als u een hoge waarde in de number_of_distinct_query_ids
kolom vindt, moet u onderzoeken of een query die vaak wordt uitgevoerd niet juist is geparameteriseerd. Niet-geparameteriseerde query's kunnen worden gecompileerd voor elke uitvoering, die aanzienlijke CPU verbruikt en invloed heeft op de prestaties van Query Store.
Als u meer wilt weten over een afzonderlijke query, noteert u de query-hash en gebruikt u deze om het CPU-gebruik en het queryplan voor een bepaalde query-hash te identificeren.
Query's uitvoeren op de meest vaak gecompileerde query's per query-hash
Het compileren van een queryplan is een CPU-intensief proces. Azure SQL Database-cacheplannen in het geheugen voor hergebruik. Sommige query's kunnen vaak worden gecompileerd als ze niet worden geparameteriseerd of als RECOMPILE-hints hercompilatie afdwingen.
Query Store houdt het aantal keren bij dat query's worden gecompileerd. Voer de volgende query uit om de top 20 query's in Query Store te identificeren op basis van het aantal compilaties, samen met het gemiddelde aantal compilaties per minuut:
SELECT TOP (20)
query_hash,
MIN(initial_compile_start_time) as initial_compile_start_time,
MAX(last_compile_start_time) as last_compile_start_time,
CASE WHEN DATEDIFF(mi,MIN(initial_compile_start_time), MAX(last_compile_start_time)) > 0
THEN 1.* SUM(count_compiles) / DATEDIFF(mi,MIN(initial_compile_start_time),
MAX(last_compile_start_time))
ELSE 0
END as avg_compiles_minute,
SUM(count_compiles) as count_compiles
FROM sys.query_store_query AS q
GROUP BY query_hash
ORDER BY count_compiles DESC;
GO
Als u meer wilt weten over een afzonderlijke query, noteert u de query-hash en gebruikt u deze om het CPU-gebruik en het queryplan voor een bepaalde query-hash te identificeren.
Het CPU-gebruik en het queryplan voor een bepaalde query-hash identificeren
Voer de volgende query uit om de afzonderlijke query-id, querytekst en uitvoeringsplannen voor een bepaalde query_hash
query te vinden. DE CPU-tijd wordt geretourneerd in milliseconden.
Vervang de waarde voor de @query_hash
variabele door een geldige query_hash
waarde voor uw workload.
declare @query_hash binary(8);
SET @query_hash = 0x6557BE7936AA2E91;
with query_ids as (
SELECT
q.query_hash,
q.query_id,
p.query_plan_hash,
SUM(qrs.count_executions) * AVG(qrs.avg_cpu_time)/1000. as total_cpu_time_ms,
SUM(qrs.count_executions) AS sum_executions,
AVG(qrs.avg_cpu_time)/1000. AS avg_cpu_time_ms
FROM sys.query_store_query q
JOIN sys.query_store_plan p on q.query_id=p.query_id
JOIN sys.query_store_runtime_stats qrs on p.plan_id = qrs.plan_id
WHERE q.query_hash = @query_hash
GROUP BY q.query_id, q.query_hash, p.query_plan_hash)
SELECT qid.*,
qt.query_sql_text,
p.count_compiles,
TRY_CAST(p.query_plan as XML) as query_plan
FROM query_ids as qid
JOIN sys.query_store_query AS q ON qid.query_id=q.query_id
JOIN sys.query_store_query_text AS qt on q.query_text_id = qt.query_text_id
JOIN sys.query_store_plan AS p ON qid.query_id=p.query_id and qid.query_plan_hash=p.query_plan_hash
ORDER BY total_cpu_time_ms DESC;
GO
Deze query retourneert één rij voor elke variatie van een uitvoeringsplan voor de query_hash
hele geschiedenis van uw Query Store. De resultaten worden gesorteerd op totale CPU-tijd.
Interactieve Query Store-hulpprogramma's gebruiken om historisch CPU-gebruik bij te houden
Als u liever grafische hulpprogramma's gebruikt, volgt u deze stappen om de interactieve Query Store-hulpprogramma's in SSMS te gebruiken.
- Open SSMS en maak verbinding met uw database in Objectverkenner.
- Vouw het databaseknooppunt uit in Objectverkenner
- Vouw de map Query Store uit.
- Open het deelvenster Algemeen resourceverbruik .
De totale CPU-tijd voor uw database gedurende de afgelopen maand in milliseconden wordt weergegeven in het linkerbenedengedeelte van het deelvenster. In de standaardweergave wordt DE CPU-tijd geaggregeerd per dag.
Selecteer Configureren in de rechterbovenhoek van het deelvenster om een andere periode te selecteren. U kunt ook de aggregatie-eenheid wijzigen. U kunt er bijvoorbeeld voor kiezen om gegevens voor een specifiek datumbereik weer te geven en de gegevens per uur samen te voegen.
Interactieve Query Store-hulpprogramma's gebruiken om de belangrijkste query's te identificeren op CPU-tijd
Selecteer een staaf in de grafiek om in te zoomen en te zien hoe query's in een bepaalde periode worden uitgevoerd. Het deelvenster Query's voor het grootste resourcegebruik wordt geopend. U kunt ook query's voor het grootste aantal resources openen vanuit het Query Store-knooppunt onder uw database in Objectverkenner rechtstreeks.
In de standaardweergave worden in het deelvenster Query's voor het grootste resourcegebruik query's weergegeven op duur (ms). Duur kan soms lager zijn dan DE CPU-tijd: query's die parallellisme gebruiken, kunnen veel meer CPU-tijd gebruiken dan hun totale duur. De duur kan ook hoger zijn dan de CPU-tijd als de wachttijden aanzienlijk zijn. Als u query's per CPU-tijd wilt bekijken, selecteert u de vervolgkeuzelijst Metrische gegevens linksboven in het deelvenster en selecteert u CPU-tijd(ms).
Elke balk in het kwadrant linksboven vertegenwoordigt een query. Selecteer een balk om details voor die query weer te geven. In het kwadrant rechtsboven van het scherm ziet u hoeveel uitvoeringsplannen er zijn in Query Store voor die query en worden deze toegewezen op basis van het moment waarop ze zijn uitgevoerd en hoeveel van de geselecteerde metrische gegevens zijn gebruikt. Selecteer elke plan-id om te bepalen welk queryuitvoeringsplan wordt weergegeven in de onderste helft van het scherm.
Notitie
Zie Best practices met Query Store voor een handleiding voor het interpreteren van Query Store-weergaven en de shapes die worden weergegeven in de weergave Topresourceconsumenten
CPU-gebruik verminderen
Een deel van uw probleemoplossing moet meer informatie bevatten over de query's die in de vorige sectie zijn geïdentificeerd. U kunt het CPU-gebruik verminderen door indexen af te stemmen, toepassingspatronen te wijzigen, query's af te stemmen en CPU-gerelateerde instellingen voor uw database aan te passen.
- Als u nieuwe query's hebt gevonden met een aanzienlijke CPU die in de workload wordt weergegeven, controleert u of indexen zijn geoptimaliseerd voor deze query's. U kunt indexen handmatig afstemmen of het CPU-gebruik verminderen met automatische indexafstemming. Evalueer of uw maximale mate van parallelle uitvoering juist is voor uw verhoogde werkbelasting.
- Als u hebt vastgesteld dat het totale aantal uitvoeringen van query's hoger is dan voorheen, kunt u indexen afstemmen voor uw hoogste CPU-verbruikende query's en overwegen om automatische indexafstemming te overwegen. Evalueer of uw maximale mate van parallelle uitvoering juist is voor uw verhoogde werkbelasting.
- Als u query's in de workload met problemen met parametergevoelig plan (PSP) hebt gevonden, kunt u overwegen om automatische plancorrectie (force plan) te overwegen. U kunt ook handmatig een plan afdwingen in Query Store of de Transact-SQL voor de query afstemmen om te resulteren in een consistent hoog presterend queryplan.
- Als u bewijs hebt gevonden dat er een grote hoeveelheid compilatie of hercompilatie plaatsvindt, kunt u de query's zo afstemmen dat ze correct worden geparameteriseerd of geen hints opnieuw hoeven te compileren.
- Als u hebt vastgesteld dat query's overmatig parallellisme gebruiken, kunt u de maximale mate van parallelle uitvoering afstemmen.
Bekijk de volgende strategieën in deze sectie.
CPU-gebruik verminderen met automatisch afstemmen van indexen
Effectieve indexafstemming vermindert het CPU-gebruik voor veel query's. Geoptimaliseerde indexen verminderen de logische en fysieke leesbewerkingen voor een query, wat vaak leidt tot minder werk voor de query.
Azure SQL Database biedt automatisch indexbeheer voor workloads op primaire replica's. Automatisch indexbeheer maakt gebruik van machine learning voor het bewaken van uw workload en het optimaliseren van niet-geclusterde indexen op basis van een rijopslagschijf voor uw database.
Bekijk de aanbevelingen voor prestaties, inclusief indexaan aanbevelingen, in Azure Portal. U kunt deze aanbevelingen handmatig toepassen of de optie voor automatisch afstemmen van CREATE INDEX inschakelen om de prestaties van nieuwe indexen in uw database te maken en te controleren.
CPU-gebruik verminderen met automatische correctie van plannen (force plan)
Een andere veelvoorkomende oorzaak van hoge CPU-incidenten is regressie van het uitvoeringsplan. Azure SQL Database biedt de optie voor automatisch afstemmen van geforceerde plannen om regressies in queryuitvoeringsplannen in workloads op primaire replica's te identificeren. Als deze functie voor automatisch afstemmen is ingeschakeld, test Azure SQL Database of het afdwingen van een queryuitvoeringsplan resulteert in betrouwbare verbeterde prestaties voor query's met regressie van het uitvoeringsplan.
Als uw database na maart 2020 is gemaakt, is de optie voor automatisch afstemmen van geforceerd plannen automatisch ingeschakeld. Als uw database vóór deze tijd is gemaakt, wilt u mogelijk de optie voor automatisch afstemmen van het geforceerde plan inschakelen.
Indexen handmatig afstemmen
Gebruik de methoden die worden beschreven in Identificeren van de oorzaken van een hoog CPU-gebruik om queryplannen te identificeren voor uw meest cpu-verbruikende query's. Deze uitvoeringsplannen helpen u bij het identificeren en toevoegen van niet-geclusterde indexen om uw query's sneller te maken.
Elke niet-geclusterde index op basis van een schijf in uw database vereist opslagruimte en moet worden onderhouden door de SQL-engine. Wijzig bestaande indexen in plaats van nieuwe indexen toe te voegen indien mogelijk en zorg ervoor dat nieuwe indexen het CPU-gebruik kunnen verminderen. Zie Ontwerprichtlijnen voor niet-geclusterde indexen voor een overzicht van niet-geclusterde indexen.
Voor sommige workloads kunnen columnstore-indexen de beste keuze zijn om de CPU van frequente leesquery's te verminderen. Zie Columnstore-indexen - Ontwerprichtlijnen voor aanbevelingen op hoog niveau voor scenario's waarin columnstore-indexen mogelijk geschikt zijn.
Uw toepassing, query's en database-instellingen afstemmen
Bij het onderzoeken van uw belangrijkste query's vindt u mogelijk antipatroon van toepassingen, zoals 'chatty'-gedrag, workloads die baat hebben bij sharding en suboptimale databasetoegangsontwerp. Voor leesintensieve workloads kunt u alleen-lezen replica's overwegen om alleen-lezen queryworkloads te offloaden en caching in de toepassingslaag als langetermijnstrategieën om regelmatig leesgegevens uit te schalen.
U kunt er ook voor kiezen om de belangrijkste CPU handmatig af te stemmen met behulp van query's die zijn geïdentificeerd in uw workload. Handmatige afstemmingsopties omvatten het herschrijven van Transact-SQL-instructies, het afdwingen van plannen in Query Store en het toepassen van queryhints.
Als u gevallen identificeert waarbij query's soms een uitvoeringsplan gebruiken dat niet optimaal is voor prestaties, bekijkt u de oplossingen in query's die problemen met parametergevoelig plan (PSP) ondervinden
Als u niet-geparameteriseerde query's met een groot aantal plannen identificeert, kunt u overwegen om deze query's te parameteriseren en ervoor te zorgen dat u de parametergegevenstypen volledig declareert, inclusief lengte en precisie. Dit kan worden gedaan door de query's te wijzigen, een planhandleiding te maken om parameters van een specifieke query af te dwingen of door geforceerde parameterisatie op databaseniveau in te schakelen.
Als u query's met hoge compilatiepercentages identificeert, identificeert u wat de frequente compilatie veroorzaakt. De meest voorkomende oorzaak van frequente compilatie is RECOMPILE-hints. Identificeer waar mogelijk wanneer de RECOMPILE
hint is toegevoegd en welk probleem het was bedoeld om op te lossen. Onderzoek of een alternatieve oplossing voor het afstemmen van prestaties kan worden geïmplementeerd om consistente prestaties te bieden voor vaak uitgevoerde query's zonder hint RECOMPILE
.
CPU-gebruik verminderen door de maximale mate van parallelle uitvoering af te stemmen
De maximale mate van parallelle uitvoering (MAXDOP) bepaalt intraqueryparallelisme in de database-engine. Hogere MAXDOP-waarden leiden doorgaans tot meer parallelle threads per query en snellere uitvoering van query's.
In sommige gevallen kan een groot aantal parallelle query's die gelijktijdig worden uitgevoerd, een workload vertragen en een hoog CPU-gebruik veroorzaken. Overmatige parallelle uitvoering is het meest waarschijnlijk in databases met een groot aantal vCores waarbij MAXDOP is ingesteld op een hoog getal of op nul. Wanneer MAXDOP is ingesteld op nul, stelt de database-engine het aantal schedulers in dat door parallelle threads moet worden gebruikt voor het totale aantal logische kernen of 64, afhankelijk van wat kleiner is.
U kunt de maximale mate van parallelle uitvoering voor uw database identificeren met Transact-SQL. Verbinding maken naar uw database met SSMS of Azure Data Studio en voer de volgende query uit:
SELECT
name,
value,
value_for_secondary,
is_value_default
FROM sys.database_scoped_configurations
WHERE name=N'MAXDOP';
GO
U kunt experimenteren met kleine wijzigingen in de MAXDOP-configuratie op databaseniveau of afzonderlijke problematische query's wijzigen om een niet-standaard MAXDOP te gebruiken met behulp van een queryhint. Zie de voorbeelden voor het configureren van de maximale mate van parallelle uitvoering voor meer informatie.
Wanneer cpu-resources toevoegen
Het kan zijn dat de query's en indexen van uw workload goed zijn afgestemd of dat voor het afstemmen van de prestaties wijzigingen zijn vereist die u op korte termijn niet kunt aanbrengen vanwege interne processen of andere redenen. Het toevoegen van meer CPU-resources kan nuttig zijn voor deze databases. U kunt databasebronnen schalen met minimale downtime.
U kunt meer CPU-resources toevoegen aan uw Azure SQL Database door het aantal vCores of de hardwareconfiguratie voor databases te configureren met behulp van het vCore-aankoopmodel.
Onder het aankoopmodel op basis van DTU kunt u uw servicelaag verhogen en het aantal DTU's (Database Transaction Units) verhogen. Een DTU vertegenwoordigt een gemengde meting van CPU, geheugen, leesbewerkingen en schrijfbewerkingen. Een voordeel van het vCore-aankoopmodel is dat het meer gedetailleerde controle over de hardware in gebruik en het aantal vCores mogelijk maakt. U kunt Azure SQL Database migreren van het DTU-model naar het vCore-model om over te stappen tussen aankoopmodellen.
Gerelateerde inhoud
Meer informatie over het bewaken en afstemmen van prestaties van Azure SQL Database vindt u in de volgende artikelen:
- Prestaties van Azure SQL Database en Azure SQL Managed Instance bewaken met behulp van dynamische beheerweergaven
- Architectuur en ontwerphandleiding voor SQL Server-indexen
- Automatisch afstemmen in Azure Portal inschakelen om query's te bewaken en de prestaties van workloads te verbeteren
- Architectuurhandleiding voor queryverwerking
- Best practices voor Query Store
- Detecteerbare typen queryprestatieknelpunten in Azure SQL Database
- Impasses in Azure SQL Database analyseren en voorkomen