En la consulta que publicaste:
select * from <table_name>;
No existen las filas 100a-200a, porque no especificas ORDER BY. El pedido no está garantizado a menos que incluya ORDER BY por muchas razones interesantes, pero ese no es realmente el punto aquí.
Entonces, para ilustrar su punto, usemos una tabla: voy a usar la tabla Usuarios del volcado de datos de Desbordamiento de pila y ejecutaré esta consulta:
SELECT * FROM dbo.Users ORDER BY DisplayName;
De manera predeterminada, no hay índice en el campo DisplayName, por lo que SQL Server tiene que escanear toda la tabla y luego ordenarla por DisplayName. Aquí está el plan de ejecución :
No es bonito, es mucho trabajo, con un costo estimado de subárbol de alrededor de 30k. (Puede verlo pasando el mouse sobre el operador de selección en PasteThePlan). Entonces, ¿qué sucede si solo queremos las filas 100-200? Podemos usar esta sintaxis en SQL Server 2012+:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
El plan de ejecución también es bastante feo:
SQL Server todavía está escaneando toda la tabla para crear la lista ordenada solo para darle sus filas 100-200, y el costo sigue siendo de alrededor de 30k. Peor aún, esta lista completa se reconstruirá cada vez que se ejecute su consulta (porque, después de todo, alguien podría haber cambiado su DisplayName).
Para que sea más rápido, podemos crear un índice no agrupado en DisplayName, que es una copia de nuestra tabla, ordenada por ese campo específico:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
Con ese índice, el plan de ejecución de nuestra consulta ahora realiza una búsqueda de índice:
La consulta finaliza instantáneamente y tiene un costo estimado de subárbol de solo 0.66 (en lugar de 30k).
En resumen, si organiza los datos de una manera que admita las consultas que ejecuta con frecuencia, entonces sí, SQL Server puede tomar atajos para acelerar sus consultas. Si, por otro lado, todo lo que tienes son montones o índices agrupados, estás jodido.