Dela via


Join containment assumption in the New Cardinality Estimator degraderar frågeprestanda

Den här artikeln hjälper dig att lösa prestandaproblem som kan uppstå i SQL Server 2014 och senare versioner när du kompilerar dina frågor med hjälp av den nya kardinalitetsestimatorn.

Ursprunglig produktversion: SQL Server
Ursprungligt KB-nummer: 3189675

Symptom

Föreställ dig följande scenario:

  • Du använder SQL Server 2014 eller en senare version.
  • Du kör en fråga som innehåller kopplingar och filterpredikat som inte är anslutna.
  • Du kompilerar frågan med hjälp av den nya kardinalitetsuppskattningen (SQL Server) (ny CE).

I det här scenariot får du försämrad frågeprestanda.

Det här problemet uppstår inte om du kompilerar frågan med hjälp av äldre CE.

Orsak

Från SQL Server 2014 introducerades New Cardinality Estimator (New CE) för databaskompatibilitetsnivå 120 och senare. Den nya CE:n ändrar flera antaganden från den äldre CE-koden i modellen som används av Frågeoptimeraren när den beräknar kardinalitet för olika operatorer och predikat.

En av dessa ändringar är relaterad till antagandet om kopplings inneslutning.

Den äldre CE-modellen förutsätter att användarna alltid frågar efter data som finns. Det innebär att de kopplade kolumnerna finns på båda sidor av kopplingen för en kopplingspredikat som omfattar en likvärdig åtgärd för två tabeller. I närvaro av ytterligare icke-kopplingsfilterpredikat mot kopplingstabellen förutsätter äldre CE en viss korrelationsnivå för kopplingspredikat och icke-kopplingsfilterpredikat. Den här underförstådda korrelationen kallas enkel inneslutning.

Alternativt använder den nya CE:n bas inneslutning som korrelation. Den nya CE-modellen förutsätter att användare kan fråga efter data som inte finns. Det innebär att filterpredikaten i separata tabeller kanske inte är korrelerade med varandra. Därför använder vi en probabilistisk metod.

I många praktiska scenarier skapar antagandet grundläggande inneslutning bättre uppskattningar. Detta skapar i sin tur effektivare val av frågeplan. I vissa situationer kan dock ett antagande om enkel inneslutning ge bättre resultat. Om detta inträffar kan det hända att du får ett mindre effektivt val av frågeplan när du använder den nya CE:n i stället för äldre CE.

Mer information om hur du felsöker problem som rör ny CE finns i Minskad frågeprestanda efter uppgradering från SQL Server 2012 eller tidigare till 2014 eller senare.

Åtgärd

I SQL Server 2014 och senare versioner kan du använda spårningsflagga 9476 för att tvinga SQL Server att använda antagandet Enkel inneslutning i stället för standardantagandet för bas inneslutning. Om du kan ändra programfrågan är det bättre alternativet att använda frågetipset ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS efter SQL Server 2016 (13.x) SP1. Mer information finns i ANVÄNDA TIPS. Till exempel:

SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));

Om du aktiverar den här spårningsflaggan eller använder frågetipset kan du förbättra valet av frågeplan utan att helt behöva återgå till den äldre CE-modellen om följande villkor är uppfyllda:

  • Du får ett alternativ för en suboptimal frågeplan som orsakar en övergripande försämrad prestanda för frågor som innehåller kopplingar och filterpredikat som inte är anslutna.
  • Du kan verifiera en betydande felaktighet i en uppskattning av "kopplings kardinalitet" (det vill:s, det faktiska jämfört med det uppskattade antalet rader som skiljer sig avsevärt).
  • Den här felaktigheten finns inte när du kompilerar frågor med hjälp av äldre CE.

Du kan aktivera den här spårningsflaggan globalt, på sessionsnivå eller på frågenivå.

Kommentar

Om du använder spårningsflaggor felaktigt kan du försämra arbetsbelastningens prestanda. Mer information finns i Tips (Transact-SQL) – Fråga.