¿Cuál es la diferencia entre TOP y OFFSET & Fetch?

Tanto TOP como OFFSET & FETCH se pueden utilizar para limitar el número de filas devueltas. OFFSET y FETCH pueden devolver resultados similares al principio, pero existen diferencias que pueden influir en qué método es mejor para usted utilizar en su situación dada.

Todos los ejemplos de esta lección se basan en Microsoft SQL Server Management Studio y la base de datos AdventureWorks2012. Puede comenzar a utilizar estas herramientas gratuitas con mi Guía de introducción a SQL Server.

¿Cuál es la diferencia entre TOP y OFFSET & Fetch?

En las siguientes secciones cubrimos TOP y OFFSET & FETCH. Creo que una vez que lea ambas secciones comprenderá sus diferencias. Estos también se resumen en una tabla al final de este artículo.

Arriba

TOP se utiliza para devolver un número específico de filas a partir de un resultado de consulta.

La cláusula TOP ha estado disponible durante algún tiempo en versiones anteriores de SQL Server, como SQL 2005. TOP no es compatible con ANSI y su uso se limita exclusivamente a productos de Microsoft como SQL Server y MS-Access.

La cláusula TOP se usa en la lista de columnas de la instrucción SELECT y se puede usar con o sin ORDER BY.

Por ejemplo, para seleccionar los diez productos menos costosos, use

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

Aunque ORDER BY no es obligatorio, es una buena práctica, ya que sin él, no tiene garantía de qué filas se devuelven.

Un elemento exclusivo de TOP es la capacidad de devolver un porcentaje de filas. La declaración

SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

devuelve los 51 productos principales con el Costo estándar más bajo (es decir, 504 filas x 10% = 50,4, redondeado a 51).

También puede seleccionar un número específico de registros desde la parte inferior del resultado de una consulta. Para hacer esto, puede usar un truco para ordenar los registros en orden descendente de la siguiente manera:

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC

Tenga en cuenta que cuando los resultados se ordenan en orden descendente, el las cantidades más grandes se devuelven primero. Debido a esto, TOP devuelve los productos con el costo estándar más alto.

TOP puede ser muy útil en resultados grandes, ya que devolver miles de filas puede afectar el rendimiento. En muchos casos, los usos solo buscarán la parte inicial de los resultados.

TOP puede mostrar el valor de los vínculos – WITH TIES le permite también mostrar registros adicionales que tienen el mismo valor que la última fila del resultado base.

OFFSET y FETCH

OFFSET y FETCH se utilizan para devolver una ventana de registros de un conjunto de resultados. OFFSET especifica cuántas filas omitir dentro del resultado, y FETCH especifica cuántas filas desde ese punto en adelante para devolver en el resultado.

OFFSET y FETCH se introdujeron recientemente en SQL Server 2012 y son compatibles con ANSI.

Puede usar OFFSET sin FETCH, pero FETCH no puede usarse por sí solo. Independientemente, OFFSET debe usarse con una cláusula ORDER BY. La razón es simple, ya que OFFSET y FETCH son parte de la cláusula ORDER BY.

En este ejemplo, se omiten las primeras diez filas del resultado y luego se muestran las 10 siguientes en el resultado.

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

Puede replicar las filas devueltas desde TOP usando OFFSET y FETCH siempre que los resultados estén ordenados. La siguiente declaración es lo mismo que devolver el TOP 10:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Cuando OFFSET se establece en 0, no se omiten filas.

A diferencia de TOP, con OFFSET no hay medios integrados para devolver un porcentaje de filas. Sin embargo, puede obtener el suyo calculando el porcentaje de la siguiente manera:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY

El truco está en la subconsulta. Al calcular el número de filas en el resultado, podemos obtener un porcentaje. Aquí está la subconsulta. Si lo desea, puede ejecutarlo en SQL Server Management Studio.

SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product

Hay varios elementos a tener en cuenta:

  • TECHO redondea los números hacia arriba. En nuestro ejemplo, CEILING (50.4) devuelve 51.0. Esto imita el comportamiento de TOP.
  • FETCH requiere un valor entero, por lo que se usa CAST para realizar esa conversión. Así, 51.0 se convierte en, 51

Para devolver los 10 registros inferiores de un resultado, hay dos métodos. Podemos invertir el orden de clasificación como hicimos para TOP:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

O podemos conservar el orden de clasificación y calcular el desplazamiento de modo que todas las filas hasta la última diez se saltan. Exploramos esta técnica con más detalle en la lección SQL sobre OFFSET y FETCH.

Resumen de diferencias

Aquí hay un resumen de algunas de las principales diferencias entre TOP y OFFSET & BUSCAR.

Comparación de TOP a OFFSET & FETCH

En general, si su objetivo es simplemente devolver las primeras filas, creo que TOP es una solución simple; si está buscando una solución de paginación, o necesita seleccionar filas en el medio o la parte inferior de los resultados de la consulta sin afectar el orden de clasificación original, entonces creo que OFFSET & FETCH son los mejores.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *