Podrobnosti jsou závislé na implementaci, ale obecně výsledky jsou ukládány do vyrovnávací paměti. Provedení dotazu na databázi vrátí určitou sadu výsledků. Pokud je dostatečně malý, všechny výsledky mohou být vráceny s počátečním voláním nebo některé mohou být vráceny a další výsledky jsou vráceny, když iterujete přes výsledný objekt.
Představte si sekvenci takto:
- Otevřete připojení k databázi;
- Je možné, že dojde k druhému volání k výběru databáze nebo to může být provedeno jako součást (1);
- Tímto krokem ověření a připojení je (alespoň) jedna zpáteční cesta na server (ignorování trvalých připojení);
- Provedete dotaz na klientovi;
- Tento dotaz je odeslán na server;
- Server musí určit, jak provést dotaz;
- Pokud server již dříve provedl dotaz, může být plán provádění stále v mezipaměti dotazů. Pokud ne, musí být vytvořen nový plán;
- Server provede dotaz podle zadání a vrátí výsledek klientovi;
- Tento výsledek bude obsahovat určitou vyrovnávací paměť řádků, která je závislá na implementaci. Může to být 100 řádků nebo více nebo méně. Pro každý řádek jsou vráceny všechny sloupce;
- Až budete načítat další řádky, klient nakonec požádá server o další řádky. To může být, když klient dojde, nebo to může být provedeno preventivně. Opět je to závislé na implementaci.
Smyslem toho všeho je minimalizovat zpáteční cesty na server, aniž by se posílalo zpět příliš mnoho zbytečná data, a proto, když požádáte o milion řádků, nedostanete je zpět všechny najednou.
Klauzule LIMIT – nebo vlastně jakákoli klauzule – upraví sadu výsledků.
A konečně, (7) je důležité, protože SELECT * FROM table WHERE a = 'foo'
a SELECT * FROM table WHERE a = 'bar'
jsou dva různé dotazy, pokud jde o optimalizátor databáze, takže plán provádění musí být stanoven pro každý zvlášť. Ale parametrizovaný dotaz (SELECT * FROM table WHERE a = :param
) s různými parametry je jeden dotaz a musí být naplánován pouze jednou (alespoň do doby, než vypadne z mezipaměti dotazů).