Serverkonfiguration: optimera för ad hoc-arbetsbelastningar

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAnalysplattformssystem (PDW)

Alternativet optimize for ad hoc workloads används för att förbättra effektiviteten i plancachen för arbetslaster som innehåller många ad hoc-batchar som bara används en gång. När det här alternativet är inställt 1på lagrar databasmotorn en liten kompilerad plan i plancachen när en batch kompileras för första gången, i stället för den fullständiga kompilerade planen. Det här alternativet kan hjälpa till att minska minnesbelastningen genom att inte tillåta att plancachen fylls med kompilerade planer som inte återanvänds. Om du aktiverar det här alternativet kan det dock påverka din möjlighet att felsöka engångsplaner.

Med den kompilerade planstuben kan databasmotorn känna igen att den här ad hoc-batchen kompilerades tidigare och endast lagrar en kompilerad planstub. När den här batchen anropas (kompileras eller körs) igen kompilerar databasmotorn batchen, tar bort den kompilerade planens stub från plancachen och lägger till den fullständiga kompilerade planen i plancachen.

Du hittar kompilerade planstubbar genom att fråga katalogvyn sys.dm_exec_cached_plans och leta efter "Compiled Plan" i kolumnen cacheobjtype. Stubben har ett unikt plan_handle. Den kompilerade planstuben har ingen associerad körningsplan, och frågor om planreferensen returnerar inte en grafisk eller XML-showplan.

Spårningsflagga 8032 återställer parametrarna för cachegräns till RTM-inställningen SQL Server 2005 (9.x), som i allmänhet tillåter att cacheminnen blir större. Använd den här inställningen när ofta återanvända cacheposter inte passar in i cacheminnet och när optimize for ad hoc workloads alternativet inte kunde lösa problemet med plancache.

Varning

Spårningsflagga 8032 kan orsaka dåliga prestanda om stora cacheminnen gör mindre minne tillgängligt för andra minneskonsumenter, till exempel buffertpoolen.

Anmärkningar

Att ange alternativet optimize for ad hoc workloads till 1 påverkar endast nya planer; planer som redan finns i plancachen påverkas inte.

Om du vill påverka redan cachelagrade frågeplaner omedelbart måste plancachen rensas med clear-PROCEDURE_CACHEALTER DATABASE SCOPED CONFIGURATION, eller så måste SQL Server starta om.

Recommendations

Undvik att ha ett stort antal planer för engångsbruk i plancachen. Vanliga orsaker är:

  • Datatyper av frågeparametrar som inte definieras konsekvent. Detta gäller särskilt längden på strängar men kan tillämpas på alla datatyper som har en maxlängd, en precision eller en skala. Om till exempel en parameter med namnet @Greeting skickas som nvarchar(10) på ett anrop och nvarchar(20) vid nästa anrop skapas separata planer för varje parameterstorlek.

  • Frågor som inte är parametriserade. Om en fråga har en eller flera parametrar för vilka hårdkodade värden skickas till databasmotorn kan det finnas ett stort antal frågeplaner för varje fråga. Planer kan finnas för varje kombination av frågeparameterdatatyper och längder som användes.

Om antalet engångsplaner tar en betydande del av Databasmotor för SQL Server-minnet på en OLTP-server, och dessa planer är ad hoc-planer, använder du det här serveralternativet för att minska minnesanvändningen med dessa objekt.

Om alternativet optimize for ad hoc workloads är aktiverat kan du inte visa körningsplaner för engångsfrågor, eftersom bara planutkastet lagras i cacheminnet. Beroende på din miljö och arbetsbelastning kan du dra nytta av följande två funktioner:

  • Funktionen Query Store, som introducerades i SQL Server 2016 (13.x), hjälper dig att snabbt hitta prestandaskillnader som orsakas av ändringar i frågeplanen. Query Store är aktiverat som standard på nya databaser i SQL Server 2022 (16.x) och senare versioner.

  • Tvingad parameterisering kan förbättra prestandan för vissa databaser genom att minska frekvensen för frågekompileringar och omkompileringar. Databaser som drar nytta av framtvingad parameterisering har vanligtvis stora mängder samtidiga frågor från källor som till exempel kassaprogram.

    Framtvingad parameterisering kan orsaka prestandaproblem på grund av parameterkänslighet. Mer information finns i Undersöka och lösa parameterkänsliga problem. För SQL Server 2022 (16.x) och senare versioner kan du även aktivera optimering av parameterkänslig plan.

Examples

Kör följande fråga för att hitta antalet cachelagrade planer för enkel användning:

SELECT objtype,
    cacheobjtype,
    SUM(refcounts) AS AllRefObjects,
    SUM(CAST(size_in_bytes AS BIGINT)) / 1024 / 1024 AS SizeInMB
FROM sys.dm_exec_cached_plans
WHERE objtype = 'Adhoc'
    AND usecounts = 1
GROUP BY objtype, cacheobjtype;