Jestem zapytaniem wykonawczym, które tworzy plan:
Statystyka IO:
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Więc kilka pytań
1. Dlaczego statystyki IO pokazują wyższe odczyty niż Profiler? .
W przypadku KB314648 jest OK, jeśli Profiler zgłasza wyższe liczby niż statystyki we / wy. Ale Profiler pokazuje 92283
odczyty przy opisanym zapytaniu, to samo wykonanie. Czy to oznacza, że Profiler nie liczy odczytów plików roboczych / tabel roboczych?
2. Jaka jest różnica między „stołem roboczym” a „plikiem roboczym”
I znaleziono , że:
- pliki robocze mogą być używane do przechowywania tymczasowych wyników dla złączeń skrótu i agregatów skrótu.
- tabele robocze mogą być używane do przechowywania tymczasowych wyników dla bufora zapytań, zmiennych lob, zmiennych XML i kursorów.
Czy jest między nimi jakaś fizyczna różnica?
3. Dlaczego w tym konkretnym przypadku istnieje „Stół roboczy”?
Dlaczego w ogóle mam tabelę roboczą, jeśli jest 0 logicznych odczytów? Jest zawarty w statystykach IO tylko dlatego, że może być potrzebny (w przypadku złych szacunków)?
Opis znaleziony na technecie wydaje się niejasny.
4. Co oznacza „Odczyty fizyczne” w pliku roboczym?
Czy to oznacza, że nie przydzielono wystarczającej ilości pamięci na zapytanie, więc dane musiały być zapisywane na dysk podczas wykonywania zapytania (żółte ostrzeżenie podczas Hash Match)? Czy mogę założyć, że ilekroć widzę stół roboczy / plik roboczy w statystykach we / wy z fizycznymi odczytami, nie było wystarczającej ilości pamięci dla zapytania i niektóre pośrednie wyniki zapytania musiały zostać zapisane na dysku tempdb? I ilekroć widzę tylko logiczne odczyty, używana jest pamięć RAM?
5. Jeden „plik roboczy” oznacza dokładnie jedną tabelę używaną do jednego celu?
Jeśli jest więcej niż jeden plik roboczy / stół roboczy, to nie mogę wiedzieć, do jakiej operacji jest używany?
Odpowiedzi:
1. Dlaczego statystyki IO pokazują wyższe odczyty niż Profiler?
Przepraszam, nie mam pojęcia. Często występują różnice, ponieważ mierzą różne rzeczy, jak wspomniano w artykule bazy wiedzy. Nie mam na ten temat żadnej dodatkowej dokumentacji. Być może będziesz w stanie wywnioskować pewne rzeczy poprzez szczegółowe testowanie, ale tak naprawdę nie ma gwarancji, że cokolwiek znajdziesz, pozostanie spójne między wersjami i kompilacjami. Zamierzone zachowanie jest wystarczająco niespójne, zanim zostanie uwzględnione możliwe błędy .
2. Jaka jest różnica między „stołem roboczym” a „plikiem roboczym”
Oba są obiektami wewnętrznymi; w przeciwnym razie jest to prawie to, co sugerują nazwy: stół roboczy ma strukturę podobną do tabeli, plik roboczy jest podobny do pliku. Szczegółowa struktura nie jest widoczna, chociaż niektóre szerokie funkcje można rozpoznać, sprawdzając ich metody i podążając ścieżkami ich wykonania za pomocą debuggera.
3. Dlaczego w tym konkretnym przypadku istnieje „Stół roboczy”?
Stół roboczy jest zawsze potrzebny do operacji mieszania (w trybie wiersza). Służy wewnętrznie do dystrybucji danych wejściowych do partycji mieszających (termin przeciążony, niezwiązany z partycjonowaniem tabel) i do śledzenia statusu. Nigdy nie widziałem, aby tabela robocza haszująca raportowała coś innego niż zero w wynikach statystycznych, ale nigdy tak naprawdę nie przyjrzałam się temu.
4. Co oznacza „Odczyty fizyczne” w pliku roboczym?
Pliki robocze są częścią mechanizmu stosowanego podczas rozlewania partycji mieszającej. Chociaż nieudokumentowane, odczyty fizyczne i odczyt z wyprzedzeniem występują, gdy silnik wykonawczy pobiera rozlane partycje skrótu z plików roboczych.
5. Jeden „plik roboczy” oznacza dokładnie jedną tabelę używaną do jednego celu?
Jak pamiętam, może istnieć wiele instancji. Nie ma możliwości, aby powiązać określoną
STATISTICS IO
linię z konkretnym obiektem lub węzłem planu. Jest to wieloletnie ograniczenie. Może to ulec zmianie w SQL Server 2016, chociaż nie testowałem, czy dotyczy to wewnętrznych obiektów tymczasowych.Ostatecznie niewiele można się nauczyć z
STATISTICS IO
danych wyjściowych plików roboczych i tabel roboczych poza tymi, których można się nauczyć, patrząc na inne informacje w planie po wykonaniu (lub za pośrednictwem DMV, zdarzeń rozszerzonych itp.). Przepraszam za niepełną odpowiedź, ale jest to najlepsze, co mogę zaoferować z czubka głowy.źródło