SlideShare a Scribd company logo
1 of 29
Jak działa rekurencyjne CTE?
121. Spotkanie Data Community Poland, Warszawa 06.12.2018.
@b_ratajczyk | http://bartekr.net
Bartosz Ratajczyk
Konsultant SQL Server @ 7N
Trener @ CBSG, Stacja.IT
SSIS, C#, PowerShell
dbatools, ssisUnit
Data Community Poland
SQL Saturday
@b_ratajczyk https://bartekr.net
photo: Shane O’Neill @SOZDBA
@b_ratajczyk | http://bartekr.net
Jak wygląda rekurencyjne CTE?
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Index Spool
Concatenation
Compute Scalar (x2)
Clustered Index Scan (x2)
Assert
Nested Loops
Table Spool
Table Spool
Stores the data from the input into a temporary
table in order to optimize rewinds.
• Przechowuje dane w tabeli pomocniczej w
tempdb
• Logical operation
• Lazy Spool (non-blocking)
• Eager Spool (blocking)
• Może czytać z innego spoola (Primary Node Id)
• Builder/Consumer lub Consumer
@b_ratajczyk | http://bartekr.net
Index Spool
Reformats the data from the input into a
temporary index, which is then used for
seeking with the supplied seek predicate.
• Wg dokumentacji – Nonclustered Index
Spool (Hugo Kornelis twierdzi, że Clustered
Index)
• Używa indeksu na kolumnach określonych w
Seek predicate
• Builder/Consumer
@b_ratajczyk | http://bartekr.net
Stack Spool
• Spool, który działa jak(o) sterta
• Nie istnieje jako pojedynczy operator w planie zapytania
• Reprezentowany przez Index Spool + Table Spool
• Oba mają atrybut With Stack == True
• Table Spool ma ustawione Primary Node Id z Index Spool
• Używane tylko dla rekurencyjnych CTE
@b_ratajczyk | http://bartekr.net
Kroki działania
Czyli jak jest budowany wynik
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Index Spool #0 -> Concatenation #1 -> Compute Scalar #2 -> Clustered Index Scan #3
Compute Scalar #2 ustawia poziom rekurencji = 0
Concatenation #1 zwraca najpierw wyniki z „górnej gałęzi” planu
Wyniki trafiają do Index Spool #0 (tabela pomocnicza) i są przekazywane do SELECT
Index Spool #0 przechowuje dane dla SELECT + poziom rekurencji (na nim jest indeks)
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Table Spool #7 == pobranie najnowszej wartości z Index Spool #0
Compute Scalar #6 ustawia poziom rekurencji
Nested Loops #5 wyszukuje rekordy dla wartości z Table Spool #7
Assert #4 sprawdza, czy poziom rekurencji nie przekracza progu
Concatenation #1 przesyła wynik do Index Spool #0
Wyniki trafiają do Index Spool #0 (tabela pomocnicza) i są przekazywane do SELECT
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Prezes
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych
[0] Dodaj każdy rekord do sterty
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Członek Zarządu C3
[7] Skasuj ze sterty ostatnio przetwarzany rekord Prezes
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych
[0] Dodaj każdy rekord do sterty
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Dyrektor Wykonawczy DW4
[7] Skasuj ze sterty ostatnio przetwarzany rekord Członek Zarządu C3
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych
[0] Dodaj każdy rekord do sterty
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Dyrektor D8
[7] Skasuj ze sterty ostatnio przetwarzany rekord Dyrektor Wykonawczy DW4
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych
[0] Dodaj każdy rekord do sterty
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Kierownik K1 D8
[7] Skasuj ze sterty ostatnio przetwarzany rekord Dyrektor D8
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych (brak)
Nie ma nowych rekordów
@b_ratajczyk | http://bartekr.net
@b_ratajczyk | http://bartekr.net
Przetwarzany rekord: Dyrektor Wykonawczy DW3
[7] Skasuj ze sterty ostatnio przetwarzany rekord Kierownik K1 D8
[7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj)
[5] Dla rekordu pobierz rekordy jego podwładnych
[0] Dodaj każdy rekord do sterty
I tak dalej, aż do końca
@b_ratajczyk | http://bartekr.net
CTE + Insert
Problem ze StackOverflow.com
https://stackoverflow.com/questions/50157079/sql-server-cte-loop-insert-all-record-together
@b_ratajczyk | http://bartekr.net
Dodawanie i czytanie z tej samej tabeli w CTE
@b_ratajczyk | http://bartekr.net
Bez INSERT: 103 rekordy
Z INSERT: 13 rekordów
@b_ratajczyk | http://bartekr.net
Rozwiązanie
• Albo użyć innej tabeli tymczasowej
• Albo użyć MERGE (tworzy Eager Spool)
@b_ratajczyk | http://bartekr.net
To jest ten czas,
kiedy zadajecie pytania
@b_ratajczyk | http://bartekr.net

More Related Content

Similar to Jak działa rekurencyjne CTE?

20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and AnalyticsŁukasz Grala
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbaćBartosz Ratajczyk
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPROIDEA
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychMarcinStachniuk
 
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future ProcessingPROIDEA
 
Microsoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuMicrosoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuHighWheelSoftware
 
Roman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychRoman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychWomen in Technology Poland
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JSDawid Rusnak
 
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PROIDEA
 
SQLDay 2014 - Change Tracking & Change Data Capture
SQLDay 2014 - Change Tracking & Change Data CaptureSQLDay 2014 - Change Tracking & Change Data Capture
SQLDay 2014 - Change Tracking & Change Data CaptureKamil Nowinski
 
Czwartki z bi - Reporting Services - podstawy
Czwartki z bi - Reporting Services - podstawyCzwartki z bi - Reporting Services - podstawy
Czwartki z bi - Reporting Services - podstawyMariusz Koprowski
 
VirtualStudy.pl - Czwartki z BI - Reporting Services
VirtualStudy.pl - Czwartki z BI - Reporting ServicesVirtualStudy.pl - Czwartki z BI - Reporting Services
VirtualStudy.pl - Czwartki z BI - Reporting ServicesSSAS.PL
 
Agregacja i analiza logów
Agregacja i analiza logówAgregacja i analiza logów
Agregacja i analiza logówDivante
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceDawid Urbański
 
AnalyticsConf : Azure SQL Data Warehouse
AnalyticsConf : Azure SQL Data WarehouseAnalyticsConf : Azure SQL Data Warehouse
AnalyticsConf : Azure SQL Data WarehouseWlodek Bielski
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1Kamil Fojuth
 

Similar to Jak działa rekurencyjne CTE? (20)

20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics20060416   Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
20060416 Azure Boot Camp 2016- Azure Data Lake Storage and Analytics
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
Zarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danychZarządzanie zamianami w relacyjnych bazach danych
Zarządzanie zamianami w relacyjnych bazach danych
 
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
4Developers 2015: .NET 2015 - co nowego? - Michał Dudak, Future Processing
 
Microsoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuMicrosoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 roku
 
Roman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danychRoman Czarko-Wasiutycz- Projektowanie baz danych
Roman Czarko-Wasiutycz- Projektowanie baz danych
 
Metaprogramowanie w JS
Metaprogramowanie w JSMetaprogramowanie w JS
Metaprogramowanie w JS
 
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
PLNOG16: Nowe założenia dla zbieranie logów, statystyk i alertów, Maciej Kałk...
 
SQLDay 2014 - Change Tracking & Change Data Capture
SQLDay 2014 - Change Tracking & Change Data CaptureSQLDay 2014 - Change Tracking & Change Data Capture
SQLDay 2014 - Change Tracking & Change Data Capture
 
Czwartki z bi - Reporting Services - podstawy
Czwartki z bi - Reporting Services - podstawyCzwartki z bi - Reporting Services - podstawy
Czwartki z bi - Reporting Services - podstawy
 
VirtualStudy.pl - Czwartki z BI - Reporting Services
VirtualStudy.pl - Czwartki z BI - Reporting ServicesVirtualStudy.pl - Czwartki z BI - Reporting Services
VirtualStudy.pl - Czwartki z BI - Reporting Services
 
Agregacja i analiza logów
Agregacja i analiza logówAgregacja i analiza logów
Agregacja i analiza logów
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
University day 2
University day 2University day 2
University day 2
 
Cw1 ir dod2
Cw1 ir dod2Cw1 ir dod2
Cw1 ir dod2
 
WordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyceWordUp Trójmiasto - Sage 9 w praktyce
WordUp Trójmiasto - Sage 9 w praktyce
 
AnalyticsConf : Azure SQL Data Warehouse
AnalyticsConf : Azure SQL Data WarehouseAnalyticsConf : Azure SQL Data Warehouse
AnalyticsConf : Azure SQL Data Warehouse
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1
 

More from Bartosz Ratajczyk

SQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiSQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiBartosz Ratajczyk
 
OLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastOLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastBartosz Ratajczyk
 
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processSqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processBartosz Ratajczyk
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISBartosz Ratajczyk
 
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534Bartosz Ratajczyk
 
Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Bartosz Ratajczyk
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Bartosz Ratajczyk
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowaneBartosz Ratajczyk
 
Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Bartosz Ratajczyk
 

More from Bartosz Ratajczyk (14)

SQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze krokiSQL Server + docker - pierwsze kroki
SQL Server + docker - pierwsze kroki
 
OLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fastOLE DB - kiedy FastLoad nie jest takie fast
OLE DB - kiedy FastLoad nie jest takie fast
 
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment processSqlSaturday Denmark 2017 - Automate your SSIS deployment process
SqlSaturday Denmark 2017 - Automate your SSIS deployment process
 
Zautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSISZautomatyzuj swój proces wdrażania projektów SSIS
Zautomatyzuj swój proces wdrażania projektów SSIS
 
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
How minimalloggingcanhelpme bartoszratajczyk_sql_sat534
 
Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowane
 
Po co mi Temporal Tables?
Po co mi Temporal Tables?Po co mi Temporal Tables?
Po co mi Temporal Tables?
 
Co to te CTE?
Co to te CTE?Co to te CTE?
Co to te CTE?
 
O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?
 
Alerty WMI
Alerty WMIAlerty WMI
Alerty WMI
 
Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?Czy mi się przyda hierarchyid?
Czy mi się przyda hierarchyid?
 

Jak działa rekurencyjne CTE?

  • 1. Jak działa rekurencyjne CTE? 121. Spotkanie Data Community Poland, Warszawa 06.12.2018. @b_ratajczyk | http://bartekr.net
  • 2. Bartosz Ratajczyk Konsultant SQL Server @ 7N Trener @ CBSG, Stacja.IT SSIS, C#, PowerShell dbatools, ssisUnit Data Community Poland SQL Saturday @b_ratajczyk https://bartekr.net photo: Shane O’Neill @SOZDBA @b_ratajczyk | http://bartekr.net
  • 3. Jak wygląda rekurencyjne CTE? @b_ratajczyk | http://bartekr.net
  • 5. @b_ratajczyk | http://bartekr.net Index Spool Concatenation Compute Scalar (x2) Clustered Index Scan (x2) Assert Nested Loops Table Spool
  • 6. Table Spool Stores the data from the input into a temporary table in order to optimize rewinds. • Przechowuje dane w tabeli pomocniczej w tempdb • Logical operation • Lazy Spool (non-blocking) • Eager Spool (blocking) • Może czytać z innego spoola (Primary Node Id) • Builder/Consumer lub Consumer @b_ratajczyk | http://bartekr.net
  • 7. Index Spool Reformats the data from the input into a temporary index, which is then used for seeking with the supplied seek predicate. • Wg dokumentacji – Nonclustered Index Spool (Hugo Kornelis twierdzi, że Clustered Index) • Używa indeksu na kolumnach określonych w Seek predicate • Builder/Consumer @b_ratajczyk | http://bartekr.net
  • 8. Stack Spool • Spool, który działa jak(o) sterta • Nie istnieje jako pojedynczy operator w planie zapytania • Reprezentowany przez Index Spool + Table Spool • Oba mają atrybut With Stack == True • Table Spool ma ustawione Primary Node Id z Index Spool • Używane tylko dla rekurencyjnych CTE @b_ratajczyk | http://bartekr.net
  • 9. Kroki działania Czyli jak jest budowany wynik @b_ratajczyk | http://bartekr.net
  • 10. @b_ratajczyk | http://bartekr.net Index Spool #0 -> Concatenation #1 -> Compute Scalar #2 -> Clustered Index Scan #3 Compute Scalar #2 ustawia poziom rekurencji = 0 Concatenation #1 zwraca najpierw wyniki z „górnej gałęzi” planu Wyniki trafiają do Index Spool #0 (tabela pomocnicza) i są przekazywane do SELECT Index Spool #0 przechowuje dane dla SELECT + poziom rekurencji (na nim jest indeks)
  • 12. @b_ratajczyk | http://bartekr.net Table Spool #7 == pobranie najnowszej wartości z Index Spool #0 Compute Scalar #6 ustawia poziom rekurencji Nested Loops #5 wyszukuje rekordy dla wartości z Table Spool #7 Assert #4 sprawdza, czy poziom rekurencji nie przekracza progu Concatenation #1 przesyła wynik do Index Spool #0 Wyniki trafiają do Index Spool #0 (tabela pomocnicza) i są przekazywane do SELECT
  • 13. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Prezes [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych [0] Dodaj każdy rekord do sterty
  • 15. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Członek Zarządu C3 [7] Skasuj ze sterty ostatnio przetwarzany rekord Prezes [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych [0] Dodaj każdy rekord do sterty
  • 17. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Dyrektor Wykonawczy DW4 [7] Skasuj ze sterty ostatnio przetwarzany rekord Członek Zarządu C3 [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych [0] Dodaj każdy rekord do sterty
  • 19. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Dyrektor D8 [7] Skasuj ze sterty ostatnio przetwarzany rekord Dyrektor Wykonawczy DW4 [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych [0] Dodaj każdy rekord do sterty
  • 21. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Kierownik K1 D8 [7] Skasuj ze sterty ostatnio przetwarzany rekord Dyrektor D8 [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych (brak) Nie ma nowych rekordów
  • 23. @b_ratajczyk | http://bartekr.net Przetwarzany rekord: Dyrektor Wykonawczy DW3 [7] Skasuj ze sterty ostatnio przetwarzany rekord Kierownik K1 D8 [7] Oznacz rekord z Index Spool #0 jako przetwarzany (ale go nie kasuj) [5] Dla rekordu pobierz rekordy jego podwładnych [0] Dodaj każdy rekord do sterty
  • 24. I tak dalej, aż do końca @b_ratajczyk | http://bartekr.net
  • 25. CTE + Insert Problem ze StackOverflow.com https://stackoverflow.com/questions/50157079/sql-server-cte-loop-insert-all-record-together @b_ratajczyk | http://bartekr.net
  • 26. Dodawanie i czytanie z tej samej tabeli w CTE @b_ratajczyk | http://bartekr.net Bez INSERT: 103 rekordy Z INSERT: 13 rekordów
  • 28. Rozwiązanie • Albo użyć innej tabeli tymczasowej • Albo użyć MERGE (tworzy Eager Spool) @b_ratajczyk | http://bartekr.net
  • 29. To jest ten czas, kiedy zadajecie pytania @b_ratajczyk | http://bartekr.net