| Termin | Definicja |
|---|---|
| Tabela tymczasowa | Tabela tymczasowa przechowuje dane wyłącznie na czas trwania sesji lub procedury. Trzy różne byty o podobnym zastosowaniuW SQL Server nazwa poprzedzona jednym znakiem # tworzy tabelę lokalną, widoczną wyłącznie w sesji, która ją utworzyła, i kasowaną przy jej zamknięciu. Dwa znaki ## dają tabelę globalną, dostępną dla wszystkich połączeń aż do rozłączenia twórcy. Osobną konstrukcją jest zmienna tabelaryczna DECLARE @t TABLE, żyjąca do końca partii lub procedury. Wszystkie trzy lądują fizycznie w bazie tempdb — zmienna tabelaryczna wcale nie jest bytem czysto pamięciowym, wbrew rozpowszechnionemu przekonaniu. Nazwy tabel lokalnych serwer uzupełnia wewnętrznie o długi przyrostek numeryczny, dlatego dwie sesje mogą bez konfliktu używać tego samego #wynik. Wybór między # a @ ma konsekwencje wydajnościoweDla tabeli #temp optymalizator buduje statystyki i potrafi oszacować liczbę wierszy, więc plan zapytania dopasowuje się do rzeczywistości. Zmienna tabelaryczna przez lata była szacowana na jeden wiersz, co przy dziesiątkach tysięcy rekordów dawało katastrofalny plan z pętlą zagnieżdżoną; obejściem bywało OPTION (RECOMPILE). Na tabeli #temp można założyć indeks nieklastrowy po wypełnieniu danymi, można ją też odbudować przez SELECT ... INTO #t, co działa jako operacja minimalnie logowana. Wspólne wyrażenie tabelaryczne (CTE, klauzula WITH) nie jest odpowiednikiem — to tylko nazwane podzapytanie, wykonywane ponownie przy każdym odwołaniu. Objawy przeciążonej bazy tempdbTypowy komunikat to niepowodzenie alokacji miejsca w tempdb albo długie oczekiwania na zasoby stron PFS i GAM, widoczne w sys.dm_os_waiting_tasks jako blokady na stronach 2:1:1 lub 2:1:3. Klasyczna przyczyna: tempdb ma jeden plik danych na maszynie z ośmioma rdzeniami, ustawiony na przyrost co jeden megabajt, i leży na tym samym wolnym dysku co baza produkcyjna. Druga rodzina błędów to nieprawidłowa nazwa obiektu #tmp po tym, jak procedura utworzyła tabelę w dynamicznym SQL wykonanym przez sp_executesql — taka tabela istnieje tylko w zakresie tego wywołania i znika, zanim kod nadrzędny się do niej odwoła. Kiedy raport w Subiekcie mieli dysk przez pół godzinySkargi na wolne zestawienia w oprogramowaniu handlowym zaskakująco często kończą się nie na przyspieszaniu procesora, lecz na przeniesieniu tempdb na oddzielny nośnik SSD, rozbiciu jej na kilka plików o równym rozmiarze i ustawieniu sensownego przyrostu. Konfigurujemy to na serwerach z Subiektem, WAPRO i Comarchem, razem z kontrolą modelu odzysku i wielkości pliku dziennika. Diagnostykę wykonujemy na miejscu albo po zabraniu jednostki do pracowni — dojazd po sprzęt i jego odwiezienie nic nie kosztują. |