Dela via


Konfigurera maximal grad av parallellitet (MAXDOP) i Azure SQL Database

gäller för:Azure SQL DatabaseSQL-databas i Fabric

Den här artikeln beskriver maximal grad av parallellitet (MAXDOP) konfigurationsinställning i Azure SQL Database.

Not

Det här innehållet fokuserar på Azure SQL Database. Azure SQL Database baseras på den senaste stabila versionen av Microsoft SQL Server-databasmotorn, så mycket av innehållet liknar det även om felsöknings- och konfigurationsalternativen skiljer sig åt. Mer information om MAXDOP i SQL Server finns i Konfigurera den maximala graden av parallellitet serverkonfigurationsalternativ.

MAXDOP styr parallellitet mellan frågor i databasmotorn. Högre MAXDOP-värden resulterar vanligtvis i fler parallella trådar per fråga och snabbare frågekörning.

I Azure SQL Database är MAXDOP-standardinställningen för varje ny enskild databas och elastisk pooldatabas 8. Det här standardvärdet förhindrar onödig resursanvändning, samtidigt som databasmotorn kan köra frågor snabbare med hjälp av parallella trådar. Det är vanligtvis inte nödvändigt att ytterligare konfigurera MAXDOP i Azure SQL Database-arbetsbelastningar, även om det kan ge fördelar som en avancerad prestandajusteringsövning.

Not

I september 2020 blev, baserat på år av telemetri från Azure SQL Database-tjänsten, MAXDOP 8 standardinställningen för nya databaser, som det optimala värdet för att hantera den bredaste variationen av kundarbetsbelastningar. Den här standardinställningen hjälpte till att förhindra prestandaproblem på grund av överdriven parallellitet. Innan dess var MAXDOP 0standardinställningen för nya databaser . MAXDOP ändrades inte automatiskt för befintliga databaser som skapades före september 2020.

Om databasmotorn i allmänhet väljer att köra en fråga med parallellitet är körningstiden snabbare. Överskott av parallellitet kan dock förbruka ytterligare processorresurser utan att förbättra frågeprestandan. I stor skala kan överflödig parallellitet negativt påverka frågeprestanda för alla frågor som körs på samma databasmotorinstans. Traditionellt har inställningen av en övre gräns för parallellitet varit en vanlig prestandajusteringsövning i SQL Server-arbetsbelastningar.

I följande tabell beskrivs hur databasmotorn fungerar när du kör frågor med olika MAXDOP-värden:

MAXDOP Uppförande
= 1 Databasmotorn använder en enda serietråd för att köra frågor. Parallella trådar används inte.
> 1 Databasmotorn anger antalet ytterligare schemaläggare som ska användas av parallella trådar till MAXDOP-värdet, eller det totala antalet logiska processorer, beroende på vilket som är mindre.
= 0 Databasmotorn anger antalet ytterligare schemaläggare som ska användas av parallella trådar till det totala antalet logiska processorer eller 64, beroende på vilket som är mindre.

Not

Varje fråga körs med minst en schemaläggare och en arbetstråd i schemaläggaren.

En fråga som körs med parallellitet använder ytterligare schemaläggare och ytterligare parallella trådar. Eftersom flera parallella trådar kan köras på samma schemaläggare kan det totala antalet trådar som används för att köra en fråga vara högre än det angivna MAXDOP-värdet eller det totala antalet logiska processorer. Mer information finns i Schemaläggning av parallella uppgifter.

Överväganden

  • I Azure SQL Database kan du ändra standardvärdet för MAXDOP:

    • På frågenivå använder du MAXDOPfrågetips.
    • På databasnivå använder du den databasspecifika konfigurationen MAXDOP.
  • Långvariga SQL Server MAXDOP-överväganden och rekommendationer gäller för Azure SQL Database.

  • Indexåtgärder som skapar eller återskapar ett index, eller som släpper ett klustrat index, kan vara resursintensiva. Du kan åsidosätta databasens MAXDOP-värde för indexåtgärder genom att ange alternativet MAXDOP-index i instruktionen CREATE INDEX eller ALTER INDEX. MAXDOP-värdet tillämpas på frågan vid körningstillfället och lagras inte i indexets metadata. Mer information finns i Konfigurera parallella indexåtgärder.

  • Förutom frågor och indexåtgärder styr även konfigurationsalternativet med databasomfattning för MAXDOP parallellitet för andra instruktioner som kan använda parallell körning, till exempel DBCC CHECKTABLE, DBCC CHECKDBoch DBCC CHECKFILEGROUP.

Rekommendationer

Att ändra MAXDOP för databasen kan ha stor inverkan på frågeprestanda och resursanvändning, både positiva och negativa. Det finns dock inget enskilt MAXDOP-värde som är optimalt för alla arbetsbelastningar. De rekommendationerna för att ange MAXDOP är nyanserade och beror på många faktorer.

Vissa högsta samtidiga arbetsbelastningar kan fungera bättre med en annan MAXDOP än andra. En korrekt konfigurerad MAXDOP bör minska risken för prestanda- och tillgänglighetsincidenter och i vissa fall minska kostnaderna genom att kunna undvika onödig resursanvändning och därmed skala ned till ett lägre tjänstmål.

Överdriven parallellitet

En högre MAXDOP minskar ofta varaktigheten för CPU-intensiva frågor. Överdriven parallellitet kan dock försämra prestandan hos andra samtidiga arbetsbelastningar genom att svälta andra förfrågningar på CPU- och resurser för arbetstrådar. I extrema fall kan överdriven parallellitet förbruka alla databasresurser eller elastiska poolresurser, vilket orsakar tidsgränser för frågor, fel och programfel.

Tips

Vi rekommenderar att kunderna undviker att ange MAXDOP till 0 även om det inte verkar orsaka problem för närvarande.

Överdriven parallellitet blir mest problematisk när det finns fler samtidiga begäranden än vad som kan stödjas av processor- och arbetstrådsresurserna som tillhandahålls av tjänstmålet. Undvik MAXDOP 0 att minska risken för potentiella framtida problem på grund av överdriven parallellitet om en databas skalas upp, eller om framtida maskinvarukonfigurationer i Azure SQL Database ger fler kärnor för samma databastjänstmål.

Ändra MAXDOP

Om du anser att en MAXDOP-inställning som skiljer sig från standardinställningen är optimal för din Azure SQL Database-arbetsbelastning kan du använda instruktionen ALTER DATABASE SCOPED CONFIGURATION T-SQL. Exempel finns i avsnittet Exempel med Transact-SQL- nedan. Om du vill ändra MAXDOP till ett icke-standardvärde för varje ny databas som du skapar lägger du till det här steget i databasdistributionsprocessen.

Om den icke-standardiserade MAXDOP endast gynnar en liten delmängd av frågeförfrågningar i arbetsbelastningen kan du åsidosätta MAXDOP på objektnivå genom att lägga till hint OPTION (MAXDOP). Exempel finns i Exempel med Transact-SQL.

Testa dina MAXDOP-konfigurationsändringar noggrant med belastningstestning med realistiska samtidiga frågebelastningar.

MAXDOP för de primära och sekundära replikerna kan ställas in oberoende av varandra om olika MAXDOP-inställningar är optimala för läs- och skriv- och skrivskyddade arbetsbelastningar. Detta gäller för sekundära repliker på Azure SQL read scale-out, geo-replikering och Hyperscale-tjänstenivå . Som standard ärver alla sekundära repliker MAXDOP-konfigurationen för den primära repliken.

Behörigheter

ALTER DATABASE SCOPED CONFIGURATION-instruktionen måste köras som serveradministratör, som medlem i databasrollen db_ownereller en användare som har beviljats behörigheten ALTER ANY DATABASE SCOPED CONFIGURATION.

Exempel

I de här exemplen används den senaste AdventureWorksLT exempeldatabasen när alternativet SAMPLE väljs för en ny enkel databas i Azure SQL Database.

PowerShell

Databasspecifik konfiguration för MAXDOP

Det här exemplet visar hur du använder ALTER DATABASE SCOPED CONFIGURATION-instruktionen för att ange MAXDOP konfiguration till 2. Inställningen börjar gälla omedelbart för nya frågor. PowerShell-cmdleten Invoke-SqlCmd kör de T-SQL-frågor som ska anges och returnerar konfigurationen för MAXDOP-databasens omfång.

$dbName = "sample" 
$serverName = <server name here>
$serveradminLogin = <login here>
$serveradminPassword = <password here>
$desiredMAXDOP = 8

$params = @{
    'database' = $dbName
    'serverInstance' =  $serverName
    'username' = $serveradminLogin
    'password' = $serveradminPassword
    'outputSqlErrors' = $true
    'query' = 'ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = ' + $desiredMAXDOP + ';
     SELECT [value] FROM sys.database_scoped_configurations WHERE [name] = ''MAXDOP'';'
  }
  Invoke-SqlCmd @params

Det här exemplet är till för användning med Azure SQL Databases med läsbara skalbara repliker aktiverade, geo-replikeringoch sekundära Azure SQL Database Hyperscale-repliker. Till exempel är den primära repliken inställd på ett annat standardvärde för MAXDOP än den sekundära repliken, för att förutse att det kan finnas skillnader mellan en skriv- och läsbörda och en endast-läs arbetsbelastning.

$dbName = "sample" 
$serverName = <server name here>
$serveradminLogin = <login here>
$serveradminPassword = <password here>
$desiredMAXDOP_primary = 8
$desiredMAXDOP_secondary_readonly = 1

$params = @{
    'database' = $dbName
    'serverInstance' =  $serverName
    'username' = $serveradminLogin
    'password' = $serveradminPassword
    'outputSqlErrors' = $true
    'query' = 'ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = ' + $desiredMAXDOP_primary + ';
    ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = ' + $desiredMAXDOP_secondary_readonly + ';
    SELECT [value], value_for_secondary FROM sys.database_scoped_configurations WHERE [name] = ''MAXDOP'';'
  }
  Invoke-SqlCmd @params

Transact-SQL

Du kan använda Azure-portalens frågeredigerare för Azure SQL Database, SQL Server Management Studio (SSMS) eller Azure Data Studio för att köra T-SQL-frågor mot din Azure SQL Database.

  1. Öppna ett nytt frågefönster.

  2. Anslut till databasen där du vill ändra MAXDOP. Du kan inte ändra databasomfattande konfigurationer i master-databasen.

  3. Kopiera och klistra in följande exempel i frågefönstret och välj Kör.

Databasspecifik konfiguration för MAXDOP

Det här exemplet visar hur du bestämmer den aktuella databaskonfigurationen för MAXDOP-databasen med hjälp av sys.database_scoped_configurations-systemkatalogvyn.

SELECT [value] FROM sys.database_scoped_configurations WHERE [name] = 'MAXDOP';

Det här exemplet visar hur du använder ALTER DATABASE SCOPED CONFIGURATION-instruktionen för att ange MAXDOP konfiguration till 8. Inställningen börjar gälla omedelbart.

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 8;

Det här exemplet är till för användning med Azure SQL Databases med läsbara skalbara repliker aktiverade, geo-replikeringoch Hyperskala sekundära repliker. Som ett exempel är den primära repliken inställd på en annan MAXDOP än den sekundära repliken, eftersom man förväntar sig att det kan skilja sig mellan skriv-läsa och skrivskyddade arbetsbelastningar. Alla uttalanden körs på den primära repliken. Kolumnen value_for_secondary i sys.database_scoped_configurations innehåller inställningar för den sekundära repliken.

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 8;
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = 1;
SELECT [value], value_for_secondary FROM sys.database_scoped_configurations WHERE [name] = 'MAXDOP';

MAXDOP-frågetips

Det här exemplet visar hur du utför en fråga med hjälp av en frågeledtråd för att tvinga max degree of parallelism till 2.

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total  
FROM SalesLT.SalesOrderDetail  
WHERE UnitPrice < 5  
GROUP BY ProductID, OrderQty  
ORDER BY ProductID, OrderQty  
OPTION (MAXDOP 2);    
GO

MAXDOP-indexalternativ

Det här exemplet visar hur du återskapar ett index med hjälp av indexalternativet för att tvinga max degree of parallelism att 12.

ALTER INDEX ALL ON SalesLT.SalesOrderDetail 
REBUILD WITH 
   (     MAXDOP = 12
       , SORT_IN_TEMPDB = ON
       , ONLINE = ON);

Nästa steg