Nella query che hai pubblicato:
select * from <table_name>;
Non esiste una riga come la 100th-200th, perché non si specifica un ORDER BY. L'ordine non è garantito se non includi ORDER BY per molte ragioni interessanti, ma non è proprio questo il punto.
Quindi, per illustrare il tuo punto, usiamo una tabella: userò la tabella Users dal dump dei dati Stack Overflow ed eseguirò questa query:
SELECT * FROM dbo.Users ORDER BY DisplayName;
Per impostazione predefinita, non esiste alcun indice nel campo DisplayName, quindi SQL Server deve eseguire la scansione dell'intera tabella, quindi ordinarlo per DisplayName. Ecco il piano di esecuzione :
Non è carino - è un sacco di lavoro, con un costo sottotetto stimato di circa 30k. (Puoi vederlo passando il mouse sopra l'operatore di selezione su PasteThePlan.) Quindi cosa succede se vogliamo solo le righe 100-200? Possiamo usare questa sintassi in SQL Server 2012+:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
Anche il piano di esecuzione è piuttosto brutto:
SQL Server sta ancora eseguendo la scansione dell'intera tabella per creare l'elenco ordinato solo per darti le tue righe 100-200 e il costo è ancora di circa 30k. Ancora peggio, l'intero elenco verrà ricostruito ogni volta che viene eseguita la query (perché, dopo tutto, qualcuno potrebbe aver cambiato il suo DisplayName.)
Per renderlo più veloce, possiamo creare un indice non cluster su DisplayName, che è una copia della nostra tabella, ordinata per quel campo specifico:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
Con quell'indice, il piano di esecuzione della nostra query ora cerca un indice:
La query termina all'istante e ha un costo di sottostruttura stimato di appena 0,66 (rispetto a 30k).
In breve, se organizzi i dati in modo da supportare le query che esegui frequentemente, quindi sì, SQL Server può prendere scorciatoie per velocizzare le tue query. Se, d'altra parte, tutto ciò che hai sono cumuli o indici raggruppati, sei fregato.