Szczegóły zależą od implementacji, ale ogólnie mówiąc, wyniki są buforowane. Wykonywanie zapytania w bazie danych zwróci pewien zestaw wyników. Jeśli jest wystarczająco mały, wszystkie wyniki mogą zostać zwrócone przy początkowym wywołaniu lub niektóre mogą być, a więcej wyników zostanie zwróconych podczas iteracji obiektu wynikowego.
Pomyśl o sekwencji w ten sposób:
- Otwierasz połączenie z bazą danych;
- Prawdopodobnie istnieje drugie wywołanie w celu wybrania bazy danych lub może być wykonane jako część (1);
- Ten etap uwierzytelniania i połączenia to (co najmniej) jedna podróż w obie strony do serwera (ignorowanie trwałych połączeń);
- Wykonujesz zapytanie na kliencie;
- To zapytanie jest wysyłane na serwer;
- Serwer musi określić, jak wykonać zapytanie;
- Jeżeli serwer wykonał wcześniej zapytanie, plan wykonania może nadal znajdować się w pamięci podręcznej zapytań. Jeśli nie, należy utworzyć nowy plan;
- Serwer wykonuje zapytanie zgodnie z zadanym i zwraca wynik do klienta;
- Ten wynik będzie zawierał pewien bufor wierszy, który jest zależny od implementacji. Może to być 100 wierszy lub więcej lub mniej. Wszystkie kolumny są zwracane dla każdego wiersza;
- Gdy pobierasz więcej wierszy, w końcu klient poprosi serwer o więcej wierszy. Może to mieć miejsce, gdy klient się wyczerpie lub może to być zrobione zapobiegawczo. Ponownie, jest to zależne od implementacji.
Ideą tego wszystkiego jest zminimalizowanie połączeń w obie strony do serwera bez odsyłania zbyt dużo niepotrzebne dane, dlatego jeśli poprosisz o milion wierszy, nie odzyskasz ich wszystkich na raz.
Klauzule LIMIT — lub w rzeczywistości dowolna klauzula — zmodyfikują zestaw wyników.
Wreszcie (7) jest ważne, ponieważ SELECT * FROM table WHERE a = 'foo'
i SELECT * FROM table WHERE a = 'bar'
to dwa różne zapytania, jeśli chodzi o optymalizator bazy danych, więc plan wykonania musi być określony dla każdego z osobna. Ale zapytanie parametryczne (SELECT * FROM table WHERE a = :param
) o różnych parametrach to jedno zapytanie i wystarczy je zaplanować tylko raz (przynajmniej do momentu, gdy wypadnie z pamięci podręcznej zapytań).