Error SQL · orden y paginación

La paginación repite o salta filas: haz que ORDER BY sea determinista

Si dos páginas de resultados repiten o parecen saltarse filas, revisa primero el orden. Paginar sin un ORDER BY determinista significa pedir “la siguiente porción” de un conjunto cuyo orden no está completamente definido.

Lectura: 15–20 minEjemplo reproduciblePráctica con pistas

El síntoma: una fila aparece en dos páginas o desaparece entre consultas

PostgreSQL advierte que LIMIT y OFFSET necesitan un ORDER BY que produzca un orden único si quieres obtener subconjuntos predecibles. SQL Server hace la misma recomendación para resultados estables con OFFSET y FETCH: el orden debe incluir una columna o combinación de columnas garantizada como única.

Un ORDER BY incompleto puede parecer estable durante varias pruebas y cambiar cuando hay empates, cambia el plan de ejecución o cambian los datos.

Ejemplo: ordenar solo por precio deja empates

Orden incompleto
SELECT id, nombre, precio
FROM productos
ORDER BY precio
LIMIT 10 OFFSET 10;

Si varios productos tienen el mismo precio, esa columna no define por sí sola qué fila va antes dentro del empate. Dos consultas independientes pueden distribuir esas filas de forma distinta.

Añade un desempate único

Orden determinista
SELECT id, nombre, precio
FROM productos
ORDER BY precio, id
LIMIT 10 OFFSET 10;

Si id es único, la combinación precio, id establece un orden total: primero se ordena por precio y después se resuelven los empates con el identificador.

La sintaxis de paginación cambia, la necesidad de orden no

PostgreSQL utiliza LIMIT/OFFSET. SQL Server usa ORDER BY ... OFFSET ... FETCH. El detalle sintáctico cambia, pero ambos documentan la necesidad de un orden predecible para paginar de forma estable.

Un orden único no congela los datos. Si se insertan, eliminan o modifican filas entre la consulta de una página y la siguiente, la composición del conjunto puede cambiar. SQL Server documenta que la estabilidad entre peticiones también depende de que los datos subyacentes no cambien o de usar una estrategia transaccional adecuada.

Método de diagnóstico

  1. Confirma que existe ORDER BY.
  2. Busca empates en las columnas de ordenación.
  3. Añade una clave única como último criterio de desempate.
  4. Repite la prueba con varias páginas consecutivas.
  5. Si los datos cambian durante la navegación, distingue ese problema del orden y revisa la estrategia de paginación de la aplicación.

Error frecuente: confiar en el orden “que siempre veo”

Sin ORDER BY completo no existe un contrato de orden

Que una tabla parezca salir por id en tus pruebas no obliga al motor a mantener ese orden en consultas futuras.

Práctica correctiva

Intermedia · orden

Desempata pedidos con la misma fecha

Quieres paginar pedidos por fecha_creacion, pero varios pedidos comparten exactamente la misma fecha. Escribe un ORDER BY estable si id es la clave primaria.

Qué debes recordar

  • Paginar requiere un orden explícito y predecible.
  • Si la columna de orden tiene empates, añade un criterio único.
  • El orden físico observado no sustituye a ORDER BY.
  • Los cambios de datos entre páginas son un problema adicional al orden.

Conceptos relacionados

Fuentes técnicas consultadas