Kiedy wykonujesz zapytanie, dane są wczytywane do pamięci w blokach. Bloki te pozostają w pamięci, ale "starzeją się". Oznacza to, że bloki są oznaczone ostatnim dostępem, a gdy Sql Server wymaga kolejnego bloku dla nowego zapytania, a pamięć podręczna jest pełna, najrzadziej używany blok (najstarszy) jest wyrzucany z pamięci. (W większości przypadków - bloki skanowania pełnych tabel są natychmiast przedawniane, aby zapobiec przepełnieniu pamięci i zablokowaniu serwera przez skanowanie pełnych tabel).
To, co się tutaj dzieje, polega na tym, że bloki danych w pamięci z pierwszego zapytania nie zostały jeszcze wyrzucone z pamięci, więc można je wykorzystać w drugim zapytaniu, co oznacza, że unika się dostępu do dysku i poprawia wydajność.
Więc to, co tak naprawdę zadaje twoje pytanie, to „czy mogę pobrać potrzebne bloki danych do pamięci bez wczytywania ich do pamięci (właściwie wykonując zapytanie)?”. Odpowiedź brzmi:nie, chyba że chcesz buforować całe tabele i mieć je na stałe w pamięci, co od czasu zapytania (a tym samym rozmiaru danych), który opisujesz, prawdopodobnie nie jest dobrym pomysłem.
Najlepszym sposobem na poprawę wydajności jest przyjrzenie się planom wykonywania zapytań i sprawdzenie, czy zmiana indeksów może dać lepszy wynik. Istnieją dwa główne obszary, które mogą poprawić wydajność tutaj:
- tworzenie indeksu, w którym zapytanie mogłoby go użyć, aby uniknąć nieefektywnych zapytań i pełnych skanów tabeli
- dodanie większej liczby kolumn do indeksu, aby uniknąć drugiego odczytu dysku. Na przykład masz zapytanie, które zwraca kolumny A i B z klauzulą where w A i C oraz masz indeks w kolumnie A. Twoje zapytanie użyje indeksu dla kolumny A wymagającej odczytu jednego dysku, a następnie drugiego dysku hit, aby uzyskać kolumny B i C. Jeśli indeks zawierał wszystkie kolumny A, B i C, można uniknąć drugiego trafienia dysku, aby uzyskać dane.