Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Den här artikeln innehåller djupgående beskrivningar av olika funktioner för intelligent frågebearbetning (IQP), viktig information och mer information. Funktionsfamiljen intelligent frågebearbetning (IQP) innehåller funktioner med bred inverkan som förbättrar prestandan för befintliga arbetsbelastningar med minimal implementering.
Du kan göra arbetsbelastningar automatiskt berättigade till intelligent frågebearbetning genom att aktivera den tillämpliga databaskompatibilitetsnivån för databasen. Du kan ange detta med Transact-SQL. Om du till exempel vill ange en databass kompatibilitetsnivå till SQL Server 2022 (16.x):
ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 160;
Mer information om ändringar som introduceras med nya versioner finns i:
Anpassningsbara kopplingar i Batch-läge
Gäller för: SQL Server (från och med SQL Server 2017 (14.x)), Azure SQL Database
Funktionen Adaptive Joins i batchläge gör att valet av en Hash Join- eller Nested Loops Join-metod kan skjutas upp tills efter att den första indatan har genomsökts med hjälp av en enda cachelagrad plan. Operatorn Adaptive Join definierar ett tröskelvärde som används för att bestämma när en kapslad loopplan ska växlas. Din plan kan därför dynamiskt växla till en bättre kopplingsstrategi under körningen.
Mer information, inklusive hur du inaktiverar adaptiva kopplingar utan att ändra kompatibilitetsnivån, finns i Förstå adaptiva kopplingar.
Interleaved-körning för MSTVFs
Gäller för: SQL Server (från och med SQL Server 2017 (14.x)), Azure SQL Database
En tabellvärdesfunktion med flera instruktioner (MSTVF) är en typ av användardefinierad funktion som kan acceptera parametrar, köra flera T-SQL-instruktioner och RETURN
en tabell.
Interfolierad körning hjälper arbetsbelastningens prestandaproblem som beror på fasta kardinalitetsuppskattningar som är associerade med MSTVF:er. Med interfolierad körning används de faktiska radantalen från funktionen för att bättre informera om följande frågeplanbeslut.
MSTVFs har en fast kardinalitets gissning på 100 från och med SQL Server 2014 (12.x) och 1 för tidigare SQL Server-versioner.
Interfolierad körning ändrar den enkelriktade gränsen mellan optimerings- och körningsfaserna för en körning med en enda fråga och gör det möjligt för planer att anpassa sig baserat på de reviderade kardinalitetsuppskattningarna. Under optimeringen, om databasmotorn stöter på en kandidat för interfolierad exekvering som använder tabellvärdesfunktioner med flera satser (MSTVFs), pausar optimeringen, kör tillämpligt underträd, samlar in korrekta kardinalitetsuppskattningar och återupptar sedan optimeringen för åtgärder nedströms.
Följande bild visar livefrågestatistikens utdata , en delmängd av en övergripande körningsplan som visar effekten av uppskattningar av fast kardinalitet från MSTVF:er
Du kan se det faktiska radflödet jämfört med uppskattade rader. Det finns tre anmärkningsvärda områden i planen (flödet är från höger till vänster):
- MSTVF-tabellgenomsökningen har en fast uppskattning på 100 rader. I det här exemplet finns det dock 527 597 rader som flödar genom den här MSTVF-tabellskanningen, som visas i Live Query Statistics med 527597 av 100 faktiska av uppskattade - så den fasta uppskattningen är betydligt skev.
- För åtgärden Kapslade loopar antas endast 100 rader returneras av den yttre sidan av kopplingen. Med tanke på det stora antalet rader som faktiskt returneras av MSTVF är det troligt att du har det bättre med en helt annan kopplingsalgoritm.
- Observera den lilla varningssymbolen för Hash Match-åtgärden, som i det här fallet indikerar ett spill till disken.
Jämför den tidigare planen med den faktiska planen som genererades med sammankopplad körning aktiverad.
- Observera att MSTVF-tabellgenomsökningen nu återspeglar en korrekt kardinalitetsuppskattning. Observera även omordningen av den här tabellgenomsökningen och de andra åtgärderna.
- Och när det gäller kopplingsalgoritmer har vi växlat från en kapslad loopåtgärd till en Hash Match-åtgärd i stället, vilket är mer optimalt med tanke på det stora antalet rader som ingår.
- Observera också att vi inte längre har spillvarningar eftersom vi tilldelar mer minne baserat på det verkliga antalet rader som flödar ut från tabellgenomsökningen av MSTVF.
Godkända instruktioner i samband med samtidig körning
MSTVF-referensuttryck i sammanvävd körning måste vara läsbara och inte en del av en dataändringsoperation. MSTVFs är inte heller berättigade till växelvis körning om de inte använder körningskonstanter.
Fördelar med växelvis exekvering
I allmänhet, ju högre skevhet mellan det uppskattade jämfört med det faktiska antalet rader, i kombination med antalet underordnade planåtgärder, desto större prestandapåverkan.
I allmänhet är frågor om interleaved körningsfördelar där:
- Det finns en stor skevhet mellan det uppskattade jämfört med det faktiska antalet rader för den mellanliggande resultatuppsättningen (i det här fallet MSTVF).
- Och den övergripande frågan är känslig för en ändring i storleken på det mellanliggande resultatet. Detta inträffar vanligtvis när det finns ett komplext träd ovanför underträdet i frågeplanen.
En enkel
SELECT *
från en MSTVF kommer inte att dra nytta av interfolierad utförande.
Kostnad för växlad exekvering
Omkostnaderna bör vara minimala till inga. MSTVFs materialiserades redan innan interfolierad körning infördes, men skillnaden är att vi nu tillåter uppskjuten optimering och sedan använder kardinalitetsuppskattningen för den materialiserade raduppsättningen. Precis som med alla planer som påverkar ändringar kan vissa planer ändras så att vi med bättre kardinalitet för underträdet får en sämre plan för frågan överlag. Du kan till exempel återställa kompatibilitetsnivån eller använda Query Store för att tvinga fram den icke-regresserade versionen av planen.
Sammanflätad körning och sekventiella körningar
När en interfolierad körningsplan har cachelagrats används planen med de reviderade uppskattningarna för den första körningen för efterföljande körningar utan att underbygga interfolierad körning.
Spåra interfolierad körningsaktivitet
Du kan se användningsattribut i den faktiska frågekörningsplanen:
Körningsplanattribut | Beskrivning |
---|---|
InnehållerVäxlandeKörningsKandidater | Gäller för noden QueryPlan . När det är sant innebär det att planen innehåller mellanlagrade körningskandidater. |
ÄrFlätatUtfört | Attributet för elementet RuntimeInformation under RelOp för TVF-noden. När det är sant innebär det att åtgärden materialiserades som en del av en interfolierad körningsåtgärd. |
Du kan också spåra förekomster av sammanflätad exekvering via följande utökade händelser:
XEvent | Beskrivning |
---|---|
interleaved_exec_status |
Den här händelsen utlöses när parallell körning inträffar. |
interleaved_exec_stats_update |
Den här händelsen beskriver kardinalitetsuppskattningarna som uppdateras av sammanflätad exekvering. |
Interleaved_exec_disabled_reason |
Den här händelsen utlöses när en fråga med en möjlig kandidat för interfolierad körning faktiskt inte får interfolierad körning. |
En fråga måste köras för att tillåta interfolierad körning för att ändra msTVF-kardinalitetsuppskattningar. Den uppskattade körningsplanen visar dock fortfarande när det finns sammanflätade körningskandidater via ContainsInterleavedExecutionCandidates
showplan-attributet.
Sammanflätad körningscachelagring
Om en plan rensas eller tas bort från cacheminnet, sker det vid frågekörning en ny kompilering som använder sammanvävd exekvering.
En instruktion som använder OPTION (RECOMPILE)
skapar en ny plan med interfolierad körning och inte cachelagrar den.
Interleaved-körning och Query Store-samverkan
Planer som använder interlacerad körning kan tvingas fram. Planen är den version som har korrigerat kardinalitetsuppskattningar baserat på den första körningen.
Inaktivera parallell körning utan att ändra kompatibilitetsnivån
Interleaved-körning kan inaktiveras i databasen eller instruktionsomfånget samtidigt som databaskompatibilitetsnivån 140 och högre bibehålls. Om du vill inaktivera sammanflätad körning för alla frågekörningar som kommer från databasen, kör följande i kontexten av den aktuella databasen:
-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_INTERLEAVED_EXECUTION_TVF = ON;
-- Starting with SQL Server 2019, and in Azure SQL Database
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = OFF;
När den här inställningen är aktiverad visas den som aktiverad i sys.database_scoped_configurations. Om du vill återaktivera interfolierad körning för alla frågekörningar som utförs från databasen, kör du följande inom ramen för den aktuella databasen:
-- SQL Server 2017
ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_INTERLEAVED_EXECUTION_TVF = OFF;
-- Starting with SQL Server 2019, and in Azure SQL Database
ALTER DATABASE SCOPED CONFIGURATION SET INTERLEAVED_EXECUTION_TVF = ON;
Du kan också inaktivera interfolierad körning för en specifik fråga genom att beteckna DISABLE_INTERLEAVED_EXECUTION_TVF
som ett USE HINT-query hint. Till exempel:
SELECT [fo].[Order Key], [fo].[Quantity], [foo].[OutlierEventQuantity]
FROM [Fact].[Order] AS [fo]
INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession',
'1-01-2013',
'10-15-2014') AS [foo] ON [fo].[Order Key] = [foo].[Order Key]
AND [fo].[City Key] = [foo].[City Key]
AND [fo].[Customer Key] = [foo].[Customer Key]
AND [fo].[Stock Item Key] = [foo].[Stock Item Key]
AND [fo].[Order Date Key] = [foo].[Order Date Key]
AND [fo].[Picked Date Key] = [foo].[Picked Date Key]
AND [fo].[Salesperson Key] = [foo].[Salesperson Key]
AND [fo].[Picker Key] = [foo].[Picker Key]
OPTION (USE HINT('DISABLE_INTERLEAVED_EXECUTION_TVF'));
En USE HINT-frågetips har företräde framför en inställning för databasomfattningskonfiguration eller spårningsflagga .
Skalär UDF-inlining
Gäller för: SQL Server (från och med SQL Server 2019 (15.x)), Azure SQL Database
Skalär UDF-inlining omvandlar automatiskt skalära UDF:er till relationsuttryck. Den bäddar in dem i den anropande SQL-frågan. Den här omvandlingen förbättrar prestandan för arbetsbelastningar som drar nytta av skalära UDF:er. Skalbar UDF-inlining underlättar kostnadsbaserad optimering av åtgärder i UDF:er. Resultaten är effektiva, setorienterade och parallella i stället för ineffektiva, iterativa, seriella körningsplaner. Den här funktionen är aktiverad som standard under databaskompatibilitetsnivå 150 eller senare.
Mer information finns i Scalar UDF-inlining.
Uppskjuten kompilering av tabellvariabel
Gäller för: SQL Server (från och med SQL Server 2019 (15.x)), Azure SQL Database
Uppskjuten kompilering av tabellvariabler förbättrar planens kvalitet och övergripande prestanda för frågor som refererar till tabellvariabler. Under optimering och inledande plankompilering sprider den här funktionen kardinalitetsuppskattningar som baseras på faktiska antal rader för tabellvariabler. Den här exakta radantalsinformationen används sedan för att optimera nedströms planeringsoperationer.
Med uppskjuten kompilering av tabellvariabler skjuts kompileringen av en instruktion som refererar till en tabellvariabel upp till den första faktiska körningen av instruktionen. Det här uppskjutna kompileringsbeteendet är identiskt med beteendet för tillfälliga tabeller. Den här ändringen resulterar i användning av faktisk kardinalitet i stället för den ursprungliga gissningen på en rad.
Aktivera uppskjuten kompilering av tabellvariabel genom att aktivera databaskompatibilitetsnivå 150 eller högre för databasen som du är ansluten till när frågan körs.
Uppskjuten kompilering av tabellvariabler ändrar inte andra egenskaper för tabellvariabler. Den här funktionen lägger till exempel inte till kolumnstatistik i tabellvariabler.
Uppskjuten kompilering av tabellvariabel ökar inte omkompileringsfrekvensen. I stället flyttas den där den första kompileringen sker. Den resulterande cachelagrade planen genereras baserat på det inledande antalet rader i den uppskjutna kompileringstabellvariabeln. Den cachelagrade planen återanvänds av frågeförfrågningar i följd. Planen återanvänds tills den tas bort eller omkompileras.
Antal tabellvariabler som används för den inledande plankompileringen representerar ett typiskt värde som kan skilja sig från en fast gissning för antal rader. Om det är annorlunda kan efterföljande processer dra nytta av det. Prestanda kanske inte förbättras av den här funktionen om antalet tabellvariabler varierar avsevärt mellan körningar.
Inaktivera uppskjuten kompilering av tabellvariabel utan att ändra kompatibilitetsnivån
Inaktivera uppskjuten kompilering av tabellvariabeln i databas- eller instruktionsomfånget samtidigt som databaskompatibilitetsnivån 150 och högre bibehålls. Om du vill inaktivera uppskjuten kompilering av tabellvariabel för alla frågekörningar som kommer från databasen kör du följande exempel i kontexten för den tillämpliga databasen:
ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = OFF;
Om du vill återaktivera uppskjuten kompilering av tabellvariabeln för alla frågekörningar som kommer från databasen kör du följande exempel i kontexten för den tillämpliga databasen:
ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = ON;
Du kan också inaktivera uppskjuten kompilering av tabellvariabeln för en viss fråga genom att tilldela DISABLE_DEFERRED_COMPILATION_TV som en USE HINT-frågetips. Till exempel:
DECLARE @LINEITEMS TABLE
(L_OrderKey INT NOT NULL,
L_Quantity INT NOT NULL
);
INSERT @LINEITEMS
SELECT L_OrderKey, L_Quantity
FROM dbo.lineitem
WHERE L_Quantity = 5;
SELECT O_OrderKey,
O_CustKey,
O_OrderStatus,
L_QUANTITY
FROM
ORDERS,
@LINEITEMS
WHERE O_ORDERKEY = L_ORDERKEY
AND O_OrderStatus = 'O'
OPTION (USE HINT('DISABLE_DEFERRED_COMPILATION_TV'));
Optimering av parameterkänslighetsplan
gäller för: SQL Server 2022 (16.x)
Azure SQL Database
Azure SQL Managed Instance
Psp-optimering (Parameter Sensitivity Plan) är en del av den intelligenta frågebearbetningsfamiljen med funktioner. Den hanterar scenariot där en enda cachelagrad plan för en parameteriserad fråga inte är optimal för alla möjliga inkommande parametervärden. Detta är fallet med icke-enhetliga datadistributioner.
- Mer information om PSP-optimering finns i optimering av parameterkänslig plan.
- Mer information om parameterisering och parameterkänslighet, se Parameterkänslighet och Parametrar och återanvändning av exekveringsplan.
Ungefärlig bearbetning av frågor
Ungefärlig frågebearbetning är en ny funktionsfamilj. Den aggregerar över stora datamängder där svarstiden är mer kritisk än absolut precision. Ett exempel är att beräkna ett COUNT(DISTINCT())
på 10 miljarder rader för att visas på en instrumentpanel. I det här fallet är absolut precision inte viktigt, men svarstiden är kritisk.
Ungefärligt antal olika
Gäller för: SQL Server (från och med SQL Server 2019 (15.x)), Azure SQL Database
Den nya APPROX_COUNT_DISTINCT mängdfunktionen returnerar det ungefärliga antalet unika värden som inte är null i en grupp.
Den här funktionen är tillgänglig från och med SQL Server 2019 (15.x), oavsett kompatibilitetsnivå.
Mer information finns i APPROX_COUNT_DISTINCT (Transact-SQL).
Ungefärlig percentil
gäller för: SQL Server (från och med SQL Server 2022 (16.x)), Azure SQL Database
Dessa aggregeringsfunktioner beräknar percentiler för en stor datamängd med godtagbara rangbaserade felgränsningar för att fatta snabba beslut med hjälp av ungefärliga percentilaggregatfunktioner.
Mer information finns i APPROX_PERCENTILE_DISC (Transact-SQL) och APPROX_PERCENTILE_CONT (Transact-SQL)
Batchläge i raddatalager
Gäller för: SQL Server (från och med SQL Server 2019 (15.x)), Azure SQL Database
Batchläge på radlagring möjliggör användning för analytiska arbetsbelastningar utan behov av kolumnlagringsindex. Den här funktionen stöder batchlägeskörning och bitmappsfilter för heaps på disk och B-trädindex. Batchläge på radlagret möjliggör stöd för alla befintliga batchläge-aktiverade operatorer.
Anmärkning
I dokumentationen används termen B-träd vanligtvis som referens till index. I radlagringsindex implementerar databasmotorn ett B+-träd. Detta gäller inte för kolumnlagringsindex eller index i minnesoptimerade tabeller. Mer information finns i arkitekturen och designguiden för SQL Server och Azure SQL-index.
Översikt över körning av batchläge
SQL Server 2012 (11.x) introducerade en ny funktion för att påskynda analytiska arbetsbelastningar: kolumnlagringsindex. Användningsfall och prestanda för kolumnlagringsindex ökade i varje efterföljande version av SQL Server. Att skapa kolumnlagringsindex i tabeller kan förbättra prestandan för analytiska arbetsbelastningar. Det finns dock två relaterade men distinkta uppsättningar av tekniker:
- Med kolumnlagringsindex kommer analysfrågor endast åt data i de kolumner som de behöver. Sidkomprimering i columnstore-format är också effektivare än komprimering i traditionella radlagringsindex .
- Med bearbetning av batchläge bearbetar frågeoperatorer data mer effektivt. De arbetar med ett parti rader i stället för en rad i taget. Många andra skalbarhetsförbättringar är knutna till bearbetning i batchläge. Mer information om batchläge finns i Körningslägen.
De två uppsättningarna funktioner fungerar tillsammans för att förbättra indata/utdata (I/O) och CPU-användning:
- Genom att använda columnstore-index passar mer av dina data i minnet. Det minskar I/O-arbetsbelastningen.
- Bearbetning i batchläge använder CPU mer effektivt.
De två teknikerna utnyttjar varandra när det är möjligt. Batchlägesaggregeringar kan till exempel utvärderas som en del av en kolumnlagringsindexgenomsökning. Även komprimerad kolumnlagringsdata bearbetas mycket mer effektivt med hjälp av run-length-avkodning, batchkopplingar och batchaggregat.
Det är dock viktigt att förstå att de två funktionerna är oberoende:
- Du kan hämta planer för radläge som använder kolumnlagringsindex.
- Du kan hämta batchlägesplaner som endast använder radlagringsindex.
Du får vanligtvis de bästa resultaten när du använder de två funktionerna tillsammans. Före SQL Server 2019 (15.x) övervägde SQL Server-frågeoptimeraren endast bearbetning i batchläge för frågor som omfattar minst en tabell med ett kolumnlagringsindex.
Kolumnlagringsindex kanske inte är lämpliga för vissa program. Ett program kan använda en annan funktion som inte stöds med kolumnlagringsindex. Ändringar på plats är till exempel inte kompatibla med kolumnlagringskomprimering. Därför stöds inte utlösare i tabeller med grupperade kolumnlagringsindex. Ännu viktigare är att kolumnlagringsindex lägger till omkostnader för DELETE- och UPDATE-instruktioner .
För vissa hybridtransaktionsanalysarbetsbelastningar uppväger omkostnaderna för en transaktionsarbetsbelastning fördelarna med att använda kolumnlagringsindex. Sådana scenarier kan dra nytta av förbättrad CPU-användning genom att enbart använda bearbetning i batchläge. Därför tar funktionen batch-mode-on-rowstore hänsyn till batchläge för alla frågor oavsett vilken typ av index som ingår.
Arbetsbelastningar som kan dra nytta av satsvis bearbetning på radlager
Följande arbetslaster kan dra nytta av batchläge i radradlagring:
- En betydande del av arbetsbelastningen består av analysfrågor. Vanligtvis använder dessa frågor operatorer som kopplingar eller aggregeringar som bearbetar hundratusentals rader eller mer.
- Arbetsbelastningen är CPU-bunden. Om flaskhalsen är I/O rekommenderar vi fortfarande att du överväger ett kolumnlagringsindex, där det är möjligt.
- Om du skapar ett kolumnlagringsindex läggs för mycket omkostnader till transaktionsdelen av arbetsbelastningen. Eller så är det inte möjligt att skapa ett columnstore-index eftersom ditt program är beroende av en funktion som ännu inte stöds med columnstore-index.
Anmärkning
Batchläge på radlagring hjälper endast med att reducera CPU-användningen. Om flaskhalsen är I/O-relaterad och data inte redan är cachelagrad ("kall" cache), kommer batchläge på radlager inte att förbättra frågens exekveringstid. På samma sätt, om det inte finns tillräckligt med minne på datorn för att cachelagma alla data, är en prestandaförbättring osannolik.
Vad ändras med batchläge i radlagring?
Batchläge i radlager kräver att databasen har kompatibilitetsnivå 150.
Även om en fråga inte har åtkomst till några tabeller med kolumnlagringsindex använder frågeprocessorn heuristik för att avgöra om batchläget ska övervägas. Heuristiken består av följande kontroller:
- En första kontroll av tabellstorlekar, operatorer som används och uppskattade kardinaliteter i indatafrågan.
- Ytterligare kontrollpunkter, eftersom optimeraren upptäcker nya, billigare planer för frågan. Om dessa alternativa planer inte använder batchläget i någon större grad slutar optimeraren att utforska alternativ i batchläge.
Om batchläge på rowstore används visas det faktiska körläget som batchläge i frågeplanen. Genomsökningsoperatorn använder batchläge för heaps på disk och B-trädindex. Den här batchlägesgenomsökningen kan utvärdera bitmappsfilter i batchläge. Du kan också se andra batchlägesoperatorer i planen. Exempel är hashkopplingar, hash-baserade aggregeringar, sortering, fönsteraggregat, filter, sammanfogning och beräkningsskalaroperatorer.
Anmärkningar
Frågeplaner använder inte alltid batchläge. Frågeoptimeraren kan besluta att batchläget inte är fördelaktigt för frågan.
Sökutrymmet för Frågeoptimeraren ändras. Så om du får en plan i radläge kan det hända att den inte är samma som den plan du får vid en lägre kompatibilitetsnivå. Och om du får en batchlägesplan kanske det inte är samma som den plan du får med ett kolumnlagringsindex.
Planer kan också ändras för frågor som blandar columnstore- och rowstore-index på grund av den nya radlagringsgenomsökningen i batchläge.
Det finns aktuella begränsningar för det nya batchläget vid rowstore-genomsökning:
- Den startar inte för minnesinterna OLTP-tabeller eller för andra index än på diskhögar och B-träd.
- Den startar inte heller om en stor objektkolumn (LOB) hämtas eller filtreras. Den här begränsningen omfattar glesa kolumnuppsättningar och XML-kolumner.
Det finns frågor som batchläge inte används för även med columnstore-index. Exempel är frågor som omfattar markörer. Dessa undantag utökas också till batchläge i rowstore-lagring.
Konfigurera batchläge i rowstore
Databasens BATCH_MODE_ON_ROWSTORE
begränsade konfiguration är PÅ som standard.
Du kan inaktivera batchläge på radlagring utan att ändra databasens kompatibilitetsnivå:
-- Disabling batch mode on rowstore
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ON_ROWSTORE = OFF;
-- Enabling batch mode on rowstore
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ON_ROWSTORE = ON;
Du kan inaktivera batchläge i radarkiv via databasomfattningskonfiguration. Men du kan fortfarande åsidosätta inställningen på frågenivå med hjälp av frågetipset ALLOW_BATCH_MODE
. I följande exempel möjliggörs batchläge på radtabelldatabaser även om funktionen är inaktiverad via databasens omfattningskonfiguration.
SELECT [Tax Rate], [Lineage Key], [Salesperson Key], SUM(Quantity) AS SUM_QTY, SUM([Unit Price]) AS SUM_BASE_PRICE, COUNT(*) AS COUNT_ORDER
FROM Fact.OrderHistoryExtended
WHERE [Order Date Key]<=DATEADD(dd, -73, '2015-11-13')
GROUP BY [Tax Rate], [Lineage Key], [Salesperson Key]
ORDER BY [Tax Rate], [Lineage Key], [Salesperson Key]
OPTION(RECOMPILE, USE HINT('ALLOW_BATCH_MODE'));
Du kan också inaktivera batchläge i radarkivet för en specifik fråga med hjälp av frågetipset DISALLOW_BATCH_MODE
. Se följande exempel:
SELECT [Tax Rate], [Lineage Key], [Salesperson Key], SUM(Quantity) AS SUM_QTY, SUM([Unit Price]) AS SUM_BASE_PRICE, COUNT(*) AS COUNT_ORDER
FROM Fact.OrderHistoryExtended
WHERE [Order Date Key]<=DATEADD(dd, -73, '2015-11-13')
GROUP BY [Tax Rate], [Lineage Key], [Salesperson Key]
ORDER BY [Tax Rate], [Lineage Key], [Salesperson Key]
OPTION(RECOMPILE, USE HINT('DISALLOW_BATCH_MODE'));
Funktioner för feedback om frågebearbetning
Feedbackfunktionerna för frågebearbetning är en del av den intelligenta frågebearbetningsfamiljen med funktioner.
Feedback om frågebearbetning är en process där frågeprocessorn i SQL Server, Azure SQL Database och Azure SQL Managed Instance använder historiska data om en frågas körning för att avgöra om frågan kan få hjälp från en eller flera ändringar i hur den kompileras och körs. Prestandadata samlas in i Query Store, där olika förslag ges för att förbättra frågeexekveringen. Om det lyckas bevarar vi dessa ändringar av disken i minnet och/eller i Query Store för framtida användning. Om förslagen inte ger tillräcklig förbättring ignoreras de och frågan fortsätter att köras utan den feedbacken.
Information om vilka funktioner för frågebearbetning som är tillgängliga i olika versioner av SQL Server eller i Azure SQL Database eller Azure SQL Managed Instance finns i Intelligent frågebearbetning i SQL-databaser eller följande artiklar för varje feedbackfunktion.
Återkoppling om minnestilldelning
Feedback om minnesbidrag har introducerats i vågor under de senaste större versionerna av SQL Server.
Feedback om minnestilldelning i batch-läge
Information om minnesbeviljandefeedback i batchläge finns i feedback om minnesbeviljande i batchläge.
Feedback för minnesbeviljande i radläge
För information om minnesgranskningsfeedback i radläge, besök Minnesgranskningsfeedback i radläge.
Feedback om minnesbeviljande i percentil- och beständighetsläge
Information om feedback om minnestilldelning i percentil- och beständighetsläge finns i Feedback om minnestilldelning i percentil- och beständighetsläge.
Grad av parallellism (DOP) - återkoppling
Information om DOP-feedback finns i DoP-feedback (Grad av parallellitet).
Feedback om kardinalitetsuppskattning (CE)
Information om CE-feedback finns i Feedback om kardinalitetsuppskattning (CE).
Optimerad plan framtvingas med Query Store
Information om optimerad plan framtvingning med Query Store finns i Optimerad plan framtvingning med Query Store.
Optimerat Halloween-skydd
Gäller för: SQL Server (från och med SQL Server 2025 (17.x) Förhandsversion)
Optimerat Halloween-skydd kan minska tempdb
utrymmesförbrukningen och förbättra frågeprestanda genom att designa om hur databasmotorn löser Halloween-problemet. Det här problemet uppstår när en DML-instruktion (Data Modification Language) ändrar data på ett sådant sätt att samma instruktion oväntat bearbetar en rad mer än en gång.
Traditionellt skyddar databasmotorn DML-instruktioner från Halloween-problemet genom att introducera en Spool-operator i frågeplanen eller genom att dra nytta av en annan blockeringsoperator som redan finns i planen, till exempel en sorterings- eller hashmatchning.
Om en Spool-operator används skapar den en tillfällig kopia av de data som ska ändras innan några ändringar görs i data i tabellen.
Även om skyddspoolen undviker Halloween-problemet har den nackdelar:
- Spoolen kräver extra utrymme i
tempdb
, extra disk-I/O och CPU för att skriva och läsa data och extra minne för att cacha data. - Instruktionsbearbetning av underordnade frågeoperatorer blockeras tills data skrivs helt i bufferten.
- Spoolen lägger till frågeplanskomplexitet som kan göra att frågeoptimeraren genererar en mindre optimal plan.
Optimerat Halloween-skydd tar bort dessa nackdelar genom att göra Spool-operatorn onödig.
Använda optimerat Halloween-skydd
För att aktivera optimerat Halloween-skydd för en databas krävs följande krav:
- Accelererad databasåterställning (ADR) måste vara aktiverad för databasen.
- Databasen måste använda kompatibilitetsnivå 170.
- Konfigurationen
OPTIMIZED_HALLOWEEN_PROTECTION
med databasomfattning måste vara aktiverad.
Konfigurationen OPTIMIZED_HALLOWEEN_PROTECTION
med databasomfattning är aktiverad som standard. Det innebär att när du aktiverar ADR för en databas med kompatibilitetsnivå 170 börjar databasen använda optimerat Halloween-skydd.
Kör följande instruktioner för att säkerställa att en databas använder optimerat Halloween-skydd:
ALTER DATABASE [<database-name-placeholder>] SET ACCELERATED_DATABASE_RECOVERY = ON;
ALTER DATABASE [<database-name-placeholder>] SET COMPATIBILITY_LEVEL = 170;
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_HALLOWEEN_PROTECTION = ON;
För att aktivera ADR krävs ett exklusivt lås på databasen. Det innebär att ALTER DATABASE ... SET ACCELERATED_DATABASE_RECOVERY = ON
kommandot blockeras medan det finns andra sessioner i databasen och att alla nya sessioner väntar bakom dessa ALTER DATABASE
kommandon. Om du vill aktivera ADR utan att vänta kan du lägga till avslutningssatsen WITH ROLLBACK IMMEDIATE
i ALTER DATABASE
kommandot för att avbryta alla aktiva sessioner i databasen.
Om du vill inaktivera optimerat Halloween-skydd för en databas inaktiverar du konfigurationen OPTIMIZED_HALLOWEEN_PROTECTION
med databasomfattning:
ALTER DATABASE SCOPED CONFIGURATION SET OPTIMIZED_HALLOWEEN_PROTECTION = OFF;
Använda optimerat Halloween-skydd via frågetips
Du kan använda frågetipsen ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION
och DISABLE_OPTIMIZED_HALLOWEEN_PROTECTION
för att aktivera och inaktivera optimerat Halloween-skydd för en viss fråga. Tipsen måste anges via USE HINT
-satsen. Mer information finns i Frågetips (Transact-SQL).
Indikationerna fungerar under valfri kompatibilitetsnivå och åsidosätter konfigurationen på databasnivå OPTIMIZED_HALLOWEEN_PROTECTION
.
Frågetipsen ENABLE_OPTIMIZED_HALLOWEEN_PROTECTION
och DISABLE_OPTIMIZED_HALLOWEEN_PROTECTION
kan anges direkt i frågan eller via Query Store-tips.
Optimerad Halloween-skyddsegenskap i frågeplanen
När optimerat Halloween-skydd används för en operatör i frågeplanen är OptimizedHalloweenProtectionUsed
egenskapen för operatorn i XML-frågeplanen inställd på True
.
Så här fungerar optimerat Halloween-skydd
När ADR är aktiverat får varje sats i en transaktion en unik satsidentifierare, som kallas nest ID. Varje rad som ändras av en DML-sats är stämplad med nest ID för satsen. Detta krävs för att tillhandahålla ACID-transaktionssemantiken med ADR.
När databasmotorn läser data under bearbetningen av DML-instruktionen hoppar den över alla rader som har samma kapslings-ID som den aktuella DML-instruktionen. ** Det innebär att frågeprocessorn inte ser de rader som redan bearbetats av uttrycket, för att undvika Halloween-problemet.
Begränsningar för optimerat Halloween-skydd
Optimerat Halloween-skydd används för närvarande inte i följande fall:
- I en DML-instruktion som modifierar
- En tillfällig tabell, en tabellvariabel eller en icke-temporär tabell i
tempdb
databasen. - En tabell med antingen klustrat eller icke-grupperat kolumnlagringsindex.
- En graftabell eller en transaktionsregistertabell .
- En vy som skapats med alternativet CHECK .
- En tabell när tabellen eller en kolumn i tabellen har en kontrollbegränsning som använder en användardefinierad skalärfunktion.
- En tabell som har en säkerhetsprincip på radnivå med antingen ett block eller ett filterpredikat.
- En tabell som har en kolumn med attributet
FILESTREAM
.
- En tillfällig tabell, en tabellvariabel eller en icke-temporär tabell i
- I
DELETE
- ochMERGE
-instruktioner som innehållerOUTPUT
-klause. - I
MERGE
ochUPDATE ... FROM
-instruktioner som kan ändra samma rad mer än en gång.
I alla dessa fall används det traditionella Halloween-skyddet med en Spool-operator (eller en annan blockeringsoperator om det redan finns) i stället.
Om samma DML-instruktion ändrar flera tabeller i olika databaser används optimerat Halloween-skydd endast för operatorer som ändrar tabeller i de databaser där optimerat Halloween-skydd är aktiverat. Till exempel kan både det optimerade och traditionella Halloween-skyddet ske i en sammansättningsbar DML-instruktion med en OUTPUT
sats som infogar data i en tabell i en annan databas.
Relaterat innehåll
- Kopplingar (SQL Server)
- Körningslägen
- Arkitekturguide för frågebearbetning
- Showplan-referens för logiska och fysiska operatorer
- ÄNDRA DATABASOMFATTNINGSKONFIGURATION (Transact-SQL)
- Nyheter i SQL Server 2017
- Nyheter i SQL Server 2019
- Nyheter i SQL Server 2022
- Demonstrera intelligent frågebearbetning
- Utvärdering av konstant vikning och uttryck
- Intelligenta frågebearbetningsdemonstrationer på GitHub
- Prestandacenter för SQL Server Database Engine och Azure SQL Database
- Övervaka prestanda med hjälp av Query Store
- Metodtips för övervakning av arbetsbelastningar med Query Store