Beschrijving van intelligente queryverwerking
In SQL Server 2017 en 2019 en met Azure SQL heeft Microsoft veel nieuwe functies geïntroduceerd in compatibiliteitsniveaus 140 en 150. Veel van deze functies corrigeren wat voorheen antipatronen waren, zoals het gebruik van door de gebruiker gedefinieerde scalaire waardefuncties en het gebruik van tabelvariabelen.
Deze functies zijn onderverdeeld in een aantal functiesfamilies:
Intelligente queryverwerking bevat functies die de prestaties van bestaande werkbelastingen verbeteren met minimale implementatie-inspanning.
Als u wilt dat workloads automatisch in aanmerking komen voor intelligente queryverwerking, wijzigt u het toepasselijke databasecompatibiliteitsniveau in 150. Voorbeeld:
ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150;
Verwerking van adaptieve query’s
Adaptieve queryverwerking bevat veel opties waarmee queryverwerking dynamischer wordt, op basis van de uitvoeringscontext van een query. Deze opties omvatten verschillende functies die de verwerking van query's verbeteren.
Adaptieve joins: de database-engine bepaalt de keuze van join tussen hash- en geneste lussen op basis van het aantal rijen dat in de join wordt opgenomen. Adaptieve joins werken momenteel alleen in de batchuitvoeringsmodus.
De functie Interleaved Execution: ondersteunt momenteel multi-statement tabelwaardefuncties (MSTVF). Vóór SQL Server 2017 gebruikten MSTVF's een vaste rijschatting van een of 100 rijen, afhankelijk van de versie VAN SQL Server. Deze schatting kan leiden tot suboptimale queryplannen als de functie veel meer rijen retourneert. Er wordt een werkelijk aantal rijen gegenereerd op basis van de MSTVF voordat de rest van het plan wordt gecompileerd met verweven uitvoering.
Feedback over geheugen verlenen: SQL Server genereert een geheugentoe kennen in het eerste plan van de query, op basis van schattingen van het aantal rijen uit statistieken. Ernstige scheeftrekkingen in de gegevens kunnen leiden tot over- of onderschattingen van het aantal rijen, wat kan resulteren in overtoekenningen van geheugen die de concurrentie verminderen, of in ondertoekenningen, waardoor de query gegevens naar tempdb laat overlopen. Met Feedback over geheugen verlenen detecteert SQL Server deze voorwaarden en vermindert of verhoogt de hoeveelheid geheugen die aan de query wordt verleend om overloop of overbezetting te voorkomen.
Deze functies worden allemaal automatisch ingeschakeld onder de compatibiliteitsmodus 150 en vereisen geen andere wijzigingen om in te schakelen.
Tabelvariabele uitgestelde compilatie
Net als MSTVFs bevatten tabelvariabelen in SQL Server-uitvoeringsplannen een schatting van een vast aantal rijen van één rij. Net als bij MSTVF's leidde deze vaste schatting tot slechte prestaties wanneer de variabele een groter aantal rijen had dan verwacht. Met SQL Server 2019 worden tabelvariabelen nu geanalyseerd en hebben ze een werkelijk aantal rijen. Uitgestelde compilatie is vergelijkbaar met onderbroken uitvoering voor MSTVF's, behalve dat het wordt uitgevoerd tijdens de eerste compilatie van de query in plaats van dynamisch binnen het uitvoeringsschema.
Batchmodus in de rijopslag
In de batchuitvoeringsmodus kunnen gegevens in batches worden verwerkt in plaats van rij per rij. Query's die aanzienlijke CPU-kosten voor berekeningen en aggregaties opleveren, zien het grootste voordeel van dit verwerkingsmodel. Door batchverwerking en columnstore-indexen te scheiden, kunnen meer workloads profiteren van batchmodusverwerking.
Scalaire door de gebruiker gedefinieerde functie inlining
In oudere versies van SQL Server zijn scalaire functies om verschillende redenen slecht uitgevoerd. Scalaire functies zijn iteratief uitgevoerd en verwerken één rij tegelijk. Ze hadden geen juiste kostenraming in een uitvoeringsplan en ze hebben geen parallelle uitvoering in een queryplan toegestaan. Met door de gebruiker gedefinieerde functie-inlining worden deze functies omgezet in scalaire subquery's in plaats van de door de gebruiker gedefinieerde functieoperator in het uitvoeringsplan. Deze transformatie kan leiden tot aanzienlijke winsten in de prestaties voor query's die betrekking hebben op scalaire functieaanroepen.
Bij benadering unieke waarden tellen
Een veelvoorkomend datawarehouse-querypatroon is het uitvoeren van een uniek aantal orders of gebruikers. Dit opvraagpatroon kan duur zijn voor een grote tabel. Bij benadering van het aantal afzonderlijke gegevens wordt een snellere benadering geïntroduceerd voor het verzamelen van een uniek aantal door rijen te groeperen. Deze functie garandeert een foutpercentage van 2% met een betrouwbaarheidsinterval van 97%.