Esta es una pregunta conocida, pero la mejor solución que he encontrado es algo como:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
Tengo una mesa con muchas filas. No es posible utilizar esa consulta porque lleva mucho tiempo. Entonces, ¿cómo puedo hacer para seleccionar las últimas N filas sin usar ORDER BY?
EDITAR
Lo siento pregunta duplicada de este
id
está indexado, simplemente escaneará ese índice en reversa y se detendrá después de las primeras 5 filas. Si no está indexado, tendrá que hacer unaTOP N
ordenación. Esto no será peor que cualquier otra forma de hacerlo. No clasifica toda la tabla (aunque necesitaría escanear toda la tabla)Respuestas:
Puede hacerlo utilizando la función NÚMERO DE FILA POR PARTICIÓN también. Un gran ejemplo se puede encontrar aquí :
fuente
Puede hacer que el servidor SQL seleccione las últimas N filas con este SQL:
fuente
Probé el código de JonVD, pero descubrí que era muy lento, 6 segundos.
Este código tomó 0s.
fuente
OrderDate
indexado, debería ser esencialmente igual de rápido elegir la primera o la última N filas de una consulta. Me doy cuenta de que existe una posibilidad que seOrderDate
correlaciona bien con el orden insertado, pero ese es un efecto secundario en el mejor de los casos, y aún requiere un escaneo de tabla, ¿no? (Y no creo que responda a lo que el OP señala como una mejor frase redactada de su pregunta : es decir, sin clasificar)Si desea seleccionar los últimos números de filas de una tabla.
La sintaxis será como
Estas declaraciones funcionan pero de diferentes maneras. gracias chicos.
de esta manera puede obtener las últimas 10 filas, pero el orden mostrará una forma descendente
fuente
De una manera muy general y para soportar el servidor SQL aquí está
y para el rendimiento, no es malo (menos de un segundo para más de 10,000 registros en la máquina del servidor)
fuente
¿Está "Id" indexado? Si no, eso es algo importante (sospecho que ya está indexado).
Además, ¿necesita devolver TODAS las columnas? Es posible que pueda obtener una mejora sustancial en la velocidad si solo necesita un subconjunto de columnas más pequeño que pueda ser TOTALMENTE atendido por el índice en la columna ID, por ejemplo, si tiene un índice NO CLUSIFICADO en la columna Id, sin otro los campos incluidos en el índice, entonces tendría que hacer una búsqueda en el índice agrupado para que el resto de las columnas regresen y eso podría ser una gran parte del costo de la consulta. Si se trata de un índice CLUStered, o un índice NO CLUStered que incluye todos los demás campos que desea devolver en la consulta, entonces debería estar bien.
fuente
Primero obtienes un recuento récord de
Y entonces :
En SQL Server 2012
En SQL Server 2008
fuente
Aquí hay algo que puede probar sin un
order by
pero creo que requiere que cada fila sea única.N
es el número de filas que desea,L
es el número de filas en la tabla.Como se señaló anteriormente, las filas que se devuelven no están definidas.
EDITAR: esto es realmente perro lento. Sin valor realmente.
fuente
fuente
Esta consulta devuelve las últimas N filas en el orden correcto, pero su rendimiento es deficiente
fuente
use desc con orderby al final de la consulta para obtener los últimos valores.
fuente
Puede que esto no se ajuste a la pregunta, pero ...
Cláusula OFFSET
La
OFFSET number
cláusula le permite saltar varias filas y luego devolver filas después de eso.Ese enlace de documento es a Postgres; No sé si esto se aplica a Sybase / MS SQL Server.
fuente
fuente
MS no admite LIMIT en t-sql. La mayoría de las veces solo obtengo MAX (ID) y luego resta.
Esto devolverá menos de 10 registros cuando la ID no sea secuencial.
fuente
Una técnica que uso para consultar las filas MÁS RECIENTES en tablas muy grandes (más de 100 millones o más de 1 000 millones de filas) está limitando la consulta a "leer" solo el porcentaje "N" más reciente de FILAS RECIENTES. Se trata de aplicaciones del mundo real, por ejemplo, hago esto para datos meteorológicos recientes no históricos, o búsquedas recientes de noticias o datos de puntos de datos de ubicación GPS recientes.
Esta es una gran mejora en el rendimiento si sabe con certeza que sus filas están en el TOP 5% más reciente de la tabla, por ejemplo. De tal manera que incluso si hay índices en las Tablas, limita aún más las posibilidades a solo el 5% de las filas en las tablas que tienen más de 100 millones o 1+ billones de filas. Este es especialmente el caso cuando los datos antiguos requerirán lecturas de disco físico y no solo lógica en memoria lecturas de .
Esto es mucho más eficiente que SELECT TOP | POR CIENTO | LIMIT ya que no selecciona las filas, sino que simplemente limita la parte de los datos a buscar.
fuente
Para mostrar las últimas 3 filas sin usar
order by
:fuente
Intenta usar la
EXCEPT
sintaxis.Algo como esto:
fuente
Tal vez un poco tarde, pero aquí hay una selección simple que resuelve su pregunta.
fuente