sql >> Database >  >> RDS >> Sqlserver

Waarom CTE (Common Table Expressions) in sommige gevallen query's vertragen in vergelijking met tijdelijke tabellen in SQL Server

Het antwoord is simpel.

SQL Server realiseert geen CTE's. Het lijnt ze uit, zoals je kunt zien aan de uitvoeringsplannen.

Andere DBMS kan het anders implementeren, een bekend voorbeeld is Postgres, dat CTE's materialiseert (het creëert in wezen tijdelijke tabellen voor CTE's achter de motorkap).

Of expliciete materialisatie van tussenresultaten in expliciete tijdelijke tabellen sneller gaat, hangt af van de query.

Bij complexe query's kan de overhead van het schrijven en lezen van intermediaire gegevens in tijdelijke tabellen worden gecompenseerd door efficiëntere, eenvoudigere uitvoeringsplannen die de optimizer kan genereren.

Aan de andere kant, in Postgres is CTE een "optimalisatiehek" en kan de engine de predikaten niet over de CTE-grens duwen.

Soms is de ene manier beter, soms een andere. Zodra de complexiteit van de query een bepaalde drempel overschrijdt, kan een optimiser niet alle mogelijke manieren analyseren om de gegevens te verwerken en moet hij ergens genoegen mee nemen. Bijvoorbeeld de volgorde waarin de tabellen worden samengevoegd. Het aantal permutaties groeit exponentieel met het aantal tabellen waaruit u kunt kiezen. Optimizer heeft beperkte tijd om een ​​plan te genereren, dus het kan een slechte keuze zijn wanneer alle CTE's inline zijn. Wanneer u complexe zoekopdrachten handmatig in kleinere, eenvoudigere opdeelt, moet u begrijpen wat u doet, maar de Optimizer heeft een grotere kans om een ​​goed plan voor elke eenvoudige zoekopdracht te genereren.



  1. Hoe het interval tussen twee datums in PostgreSQL te vinden

  2. UTF8 MySQL-problemen op Rails - coderingsproblemen met utf8_general_ci

  3. Verbindingstime-out bij query op grote tafel

  4. Hoe de laatste invoeg-ID in Oracle te verkrijgen met MyBatis?