La differenza è proprio qui, nella seconda riga dell'output EXPLAIN:
-> Sort (cost=27.88..27.89 rows=7 width=198) (actual time=2984.688..2984.692 rows=28 loops=1)
Si noti che il "tempo effettivo" è praticamente l'intero tempo della query. L'ordinamento richiede non solo una serie di confronti (ovvero il costo dell'ordinamento di qualsiasi cosa) ma anche una gestione aggiuntiva dei dati, il server deve copiare alcuni dati (righe o puntatori a righe) in una posizione temporanea in modo che possano essere ordinati senza disturbare nient'altro .
Qualsiasi query richiederà più tempo con l'ordinamento a meno che tu non sia fortunato e il tuo ordinamento corrisponda all'ordine sul disco e l'ottimizzatore può notare che corrispondono.