Beim
Query.Last muss die gesamte Abfrage mit allen Records und allen Feldern an den Client übertragen werden.
Bei der exlpziten Abfrage wird die Anzahl am Server ermittelt, was sehr schnell gehen sollte.
Das geht nicht unbedingt schnell. Wenn man mit join usw. arbeitet, würde eine separate Abfrage von count(*) dazu führen, dass die gesamte Abfrage ggf. doppelt erzeugt werden muss. Da sollte der Cache zwar helfen, aber es ist trotzdem unnötig.
Bei einfachen Tabellen kann man natürlich count(*) benutzen und es geht auch meistens schnell (leider nicht immer...). Aber wirklich Sinn macht das trotzdem nur, wenn die Datenmengen so groß sind, dass ein Last zu lange braucht.
Nebenbei gibt es z.B. bei MS
SQL Server auch noch nette Features wie Histogrammerzeugung für die Wertverteilung in den Indexspalten, mit denen man z.B. ein Nachladen im Thread sehr gut implementieren kann.
// EDIT:
Ist dieses Verhalten eigentlich Komponenten abhängig?
Die
BDE hat sowas z.B. nicht gemacht, und auch andere lokal dateibasierte Datenbanksysteme machen das oft nicht so.