Gdybym musiał zgadywać, powiedziałbym, że to dlatego, że zapytanie 1 pobiera dane z obu tabel. Zapytania 2 i 3 (w tym samym czasie) pobierają tylko dane dla TabA.
Jeden sposób można sprawdzić to wykonując następujące czynności:
SET STATISTICS TIME ON
SET STATISTICS IO ON
Kiedy wpadłem
SELECT * FROM sys.objects
widziałem następujące wyniki.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 104 ms.
(242 row(s) affected)
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 'sysschobjs'. Scan count 1, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syssingleobjrefs'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syspalnames'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 866 ms.
Możesz rzucić okiem na # skanów, odczytów logicznych i fizycznych odczytów dla każdego zapytania. Fizyczne odczyty oczywiście trwają znacznie dłużej i reprezentują odczyt z dysku do pamięci podręcznej. Jeśli wszystkie twoje odczyty są logiczne, to twoja tabela jest całkowicie w pamięci podręcznej.
Byłbym skłonny się założyć, jeśli spojrzeć widać dużo bardziej logiczne czyta na Tabb na zapytania 1 niż na 2 i 3.
EDIT:
Tak z ciekawości zrobiłem niektóre testy i blogowane wyniki here.
Dlaczego istnieje znacznik 'C# '? To nie ma znaczenia. –
Czy uruchomiłeś te pomiary wiele razy? Wydajność kwerend w dużym stopniu zależy od tego, czy tabele są ładowane do pamięci podręcznej strony. –
należy zachować ostrożność przy użyciu pamięci podręcznej. Czysz to po każdym zapytaniu? –