Delen via


Feedback voor kardinaliteitsinschatting (CE) van expressies

Van toepassing op:Van toepassing op: SQL Server 2025 (17.x) Preview Azure SQL Database SQL-databasein Microsoft Fabric Preview

Onnauwkeurige kardinaliteitschattingen veroorzaken vaak slechte prestaties tijdens het optimaliseren van query's. De feedback van kardinaliteitschatting (CE) voor expressies breidt het framework uit dat is gestart door de CE-feedbackfunctie. Het doel is om kardinaliteitschattingen voor herhalende expressies te verbeteren. De feedback voor expressies-functie leert van eerdere uitvoeringen van expressies in query's, om geschikte CE-modelkeuzen te vinden en toe te passen wat is geleerd op toekomstige uitvoeringen van deze expressies. Net als CE-feedback worden modelaanbevelingen getest en automatisch toegepast op toekomstige queryuitvoeringen.

De feedback voor de expressiefunctie identificeert en gebruikt een modelveronderstelling die beter past bij de expressie en gegevensdistributie van een bepaalde query, waardoor de kwaliteit van het queryuitvoeringsplan wordt verbeterd. Op dit moment kan de functie feedback voor expressies planoperators identificeren waarbij het geschatte aantal rijen en het werkelijke aantal rijen zeer verschillend zijn. Feedback wordt toegepast op expressies in een query wanneer er significante fouten optreden bij het schatten van modellen en er is een bruikbaar alternatief model om te proberen.

Verschillende versies van de database-engine maken gebruik van verschillende CE-modelveronderstellingen op basis van hoe gegevens worden gedistribueerd en opgevraagd.

CE-feedback gebruiken voor expressies

CE-feedback voor expressies bewaakt queryuitvoeringen en identificeert subexpressies die consistent resulteren in kardinaliteitsfouten. Feedback wordt gegenereerd op basis van waargenomen patronen en toegepast tijdens het compileren van query's om de nauwkeurigheid van de schatting te verbeteren.

Vereisten en configuratie

Als u CE-feedback voor expressies wilt gebruiken, moet aan de volgende vereisten worden voldaan:

  • De database moet compatibiliteitsniveau 160 of hoger gebruiken.
  • De CE_FEEDBACK_FOR_EXPRESSIONS configuratie specifiek voor de database moet ingeschakeld zijn (standaard ingeschakeld).
  • De huidige status van de configuratie van het databasebereik controleren:
SELECT name,
       value,
       value_for_secondary
FROM sys.database_scoped_configurations
WHERE name = 'CE_FEEDBACK_FOR_EXPRESSIONS';

De functie kan worden ingeschakeld voor een database met de volgende configuratieopdracht voor databasebereik:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = ON;

Als u de feedback voor expressies voor een database wilt uitschakelen, schakelt u de configuratie met databasebereik CE_FEEDBACK_FOR_EXPRESSIONS uit:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK_FOR_EXPRESSIONS = OFF;

Hoe het werkt

Hoewel vingerafdrukken geen nieuw concept zijn met de SQL Server Database Engine, verwijst een vingerafdruk in de context van de functie feedback voor expressies naar de combinatie van de berekende handtekeningen vanuit een expressie. Een bedrijfsanalist in een fictief bedrijf kan bijvoorbeeld informatie verkrijgen over de orders van hun klanten waar die klanten meer dan $ 10.000 hebben uitgegeven. Een select-instructie waarbij gegevens worden verzameld uit een tabel Klanten die ook aan een tabel Orders wordt toegevoegd, kan een manier zijn om dit type gegevens weer te geven:

SELECT *
FROM Customer AS C
     INNER JOIN Orders AS O
         ON C.custkey = O.o_custkey
WHERE O.o_totalprice > 10000;

Voor deze query kan de queryoptimalisatie ervoor kiezen om gegevens op te halen uit elke tabel, Customergevolgd door Orders, alle gekoppelde kolommen uit beide tabellen te selecteren en de gegevens (met een filter) samen te voegen waarbij de totalprice volgorde groter is dan $ 10.000. Elke logische expressie, zoals een filter of join in een queryplan, genereert een handtekening die bijdraagt aan een vingerafdruk. CE-feedback voor expressies gebruikt deze vingerafdrukken om feedback te leren en toe te passen op query's die vergelijkbare subexpressies delen, zelfs als de algehele querystructuur anders is.

De functie is gericht op expressies met consistente kardinaliteitsoverschatting/onderschatting van query's. Het analyseert twee verschillende workloadpatronen die momenteel niet in aanmerking komen voor CE-feedback:

  • Workloads zonder herhaalde uitvoeringen, maar met herhaalde expressiepatronen. Bijvoorbeeld een veelgebruikt join-patroon.

  • Query's waarin één deel van de query kan profiteren van een ander CE-model dan een ander gedeelte van dezelfde query. De join tussen tabellen A en B kan bijvoorbeeld een eenvoudige insluiting vereisen, en de join tussen tabellen C en D, waarvoor mogelijk basisbesluiting is vereist.

De functie Feedback voor expressies past filter- en join-veronderstellingen toe om onjuiste schattingsproblemen op te lossen, zoals:

Filters:

  • ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
  • ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
  • ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES

Joins:

  • ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
  • Basisveronderstelling voor beheersing (er hoeft geen hint te worden doorgegeven)

Deze veronderstellingen weerspiegelen verschillende CE-modelstrategieën, zoals insluiting en onafhankelijkheid. Zie Feedback over kardinaliteitschatting uitgelegd door Kate Smith en kardinaliteitschatting voor gecorreleerde kolommen in SQL Server 2016 voor meer conceptuele achtergrond.

Levenscyclus van hints

Feedback hints vorderen door de volgende staten:

  • Bewaking: Het systeem observeert herhaalde uitvoeringen van een subexpressie en houdt bij of kardinaliteit onjuist wordt geschat.
  • Toepassen: Als verkeerde schattingen aanhouden, kan er een feedbackhint worden gegenereerd en toegepast tijdens het compileren van query's om het CE-model aan te passen.
  • Geblokkeerd: Als de toegepaste hint resulteert in een suboptimale kardinaliteitschatting, wordt het gebruik ervan in de toekomst geblokkeerd.

Deze levenscyclus zorgt ervoor dat feedback alleen wordt toegepast wanneer dit nuttig is en regressie in schattingskwaliteit vermijdt.

Regressiebeveiliging

CE-feedback voor expressies omvat regressiebeveiliging. Als een hint een slechtere kardinaliteitsraming veroorzaakt dan voorheen, wordt deze geblokkeerd. Deze beveiliging is echter beperkt tot kardinaliteitschatting en evalueert de uitvoeringstijd van query's niet. Voor regressies met betrekking tot uitvoering/runtime kan automatische correctie van plannen tussenkomen. Als de functie voor automatische correctie van plannen niet is ingeschakeld, worden acties die door de functie worden uitgevoerd, vastgelegd en beschikbaar door een query uit te voeren op de sys.dm_db_tuning_recommendations dynamische beheerweergave.

Telemetrie en monitoring

CE-feedback voor expressieactiviteit kan worden bewaakt met behulp van de volgende hulpprogramma's:

  • Uitgebreide gebeurtenissen:
    • adhoc_ce_feedback_query_level_telemetry
    • query_adhoc_ce_feedback_expression_hint
    • query_adhoc_ce_feedback_hint

De uitgebreide ce-feedback-gebeurtenissen query_ce_feedback_begin_analysis en query_ce_feedback_telemetry kunnen ook nuttig zijn tijdens het bijhouden van de activiteit van de functie.

  • Vingerafdrukgegevens worden in de cache opgeslagen in een specifieke geheugenbeheerder met de naam AdHocCEFeedbackCache. Deze cache kan worden geopend via de systeemcatalogusweergave sys.dm_exec_ce_feedback_cache.

  • Showplan-integratie

    Wanneer een CE-feedback voor expressies wordt toegepast, bevat het queryplan een CardinalityFeedback kenmerk in de Showplan XML. Deze tag geeft aan dat feedback is gebruikt om de kardinaliteitschatting voor een specifieke subexpressie aan te passen.

Cache en persistentie

Permanente feedback wordt opgeslagen in een interne Query Store-tabel (sys.plan_persist_ce_feedback_for_expressions) en opnieuw geladen bij het opstarten. Dit zorgt ervoor dat het systeem geen feedback opnieuw hoeft te leren voor vingerafdrukken die al zijn aangetroffen. Het cache-persistentiemechanisme is verliesrijk van aard, wat betekent dat feedback alleen periodiek op schijf wordt opgeslagen. De frequentie van persistentie kan momenteel niet worden geconfigureerd.

Als het SQL Server-exemplaar opnieuw wordt opgestart of het geheugen wordt gewist vóór de volgende persistentiecyclus, kan de feedback die wordt gegenereerd sinds de laatste flush verloren gaan.

Limitations

Persistentie is momenteel niet beschikbaar voor Query Store op leesbare secundaire replica's. CE-feedback voor uitdrukkingen kan anders worden toegepast op een primaire replica en een secundaire replica. De feedback blijft echter niet behouden op secundaire replica's en bestaat alleen in de cache op basis van geheugen in dat scenario. Als er een failover optreedt, gaat de feedback die was geleerd over een van de leesbare secundaires verloren.