Esta é uma pergunta conhecida, mas a melhor solução que encontrei é algo como:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
Eu tenho uma mesa com muitas linhas. Não é possível usar essa consulta porque leva muito tempo. Então, como posso fazer para selecionar as últimas N linhas sem usar ORDER BY?
EDITAR
Desculpe pergunta duplicada deste
id
estiver indexado, ele apenas fará a varredura desse índice em sentido inverso e parará após as primeiras 5 linhas. Se não estiver indexado, será necessário fazer umaTOP N
classificação. Isso não será pior do que qualquer outra maneira de fazê-lo. Ele não classificar a tabela inteira (embora seria necessário examinar a tabela inteira)Respostas:
Você pode fazer isso usando o recurso ROW NUMBER BY PARTITION. Um ótimo exemplo pode ser encontrado aqui :
fonte
Você pode fazer com que o SQL server selecione as últimas N linhas usando este SQL:
fonte
Testei o código do JonVD, mas achei muito lento, 6s.
Este código levou 0s.
fonte
OrderDate
indexado, deve ser essencialmente igualmente rápido escolher a primeira ou a última N linha de uma consulta. Sei que há uma chance deOrderDate
correlacionar bem com a ordem inserida, mas esse é um efeito colateral, na melhor das hipóteses, e ainda requer uma varredura de tabela, não? (E eu não acho que isso responde ao que os pontos op para como um joguete melhor formulada de sua pergunta : isto é, sem ordenação)Se você deseja selecionar o último número de linhas de uma tabela.
Sintaxe será como
Essas declarações funcionam de maneiras diferentes. obrigado pessoal
Desta forma, você pode obter as últimas 10 linhas, mas a ordem mostrará o modo decrescente
fonte
De uma maneira muito geral e para oferecer suporte ao SQL Server, aqui está
e para o desempenho, não é ruim (menos de um segundo para mais de 10.000 registros na máquina do servidor)
fonte
O "ID" está indexado? Caso contrário, isso é uma coisa importante a se fazer (suspeito que já esteja indexado).
Além disso, você precisa retornar TODAS as colunas? Você poderá obter uma melhoria substancial na velocidade se, na verdade, precisar apenas de um subconjunto menor de colunas que possa ser INTEGRALMENTE atendido pelo índice na coluna ID - por exemplo, se você tiver um índice NÃO EXCLUSIVO na coluna Id, sem outra campos incluídos no índice, seria necessário fazer uma pesquisa no índice clusterizado para que o restante das colunas retornasse e isso poderia estar compensando muito o custo da consulta. Se é um índice CLUSTERED ou NONCLUSTERED que inclui todos os outros campos que você deseja retornar na consulta, então você deve estar bem.
fonte
Primeiro, você obtém a contagem de registros mais
E depois :
No SQL Server 2012
No SQL Server 2008
fonte
Aqui está algo que você pode tentar sem um,
order by
mas acho que exige que cada linha seja única.N
é o número de linhas que você deseja,L
é o número de linhas na tabela.Como observado anteriormente, quais linhas são retornadas são indefinidas.
EDIT: este é realmente cachorro lento. De nenhum valor realmente.
fonte
fonte
Essa consulta retorna as últimas N linhas na ordem correta, mas seu desempenho é ruim
fonte
use desc com orderby no final da consulta para obter os últimos valores.
fonte
Isso pode não ser o ajuste certo para a pergunta, mas…
Cláusula OFFSET
A
OFFSET number
cláusula permite que você pule um número linhas e depois retorne as linhas.Esse link de documento é para o Postgres; Não sei se isso se aplica ao Sybase / MS SQL Server.
fonte
fonte
O MS não suporta LIMIT no t-sql. Na maioria das vezes, eu apenas recebo MAX (ID) e subtraio.
Isso retornará menos de 10 registros quando o ID não for seqüencial.
fonte
Uma técnica usada para consultar as linhas MAIS RECENTES em tabelas muito grandes (mais de 100 milhões ou mais de 1 bilhão de linhas) está limitando a consulta a "ler" apenas a porcentagem "N" mais recente de LINHAS RECENTES. São aplicativos do mundo real, por exemplo, faço isso para Dados Meteorológicos Recentes não históricos, ou pesquisas recentes de feeds de Notícias ou dados recentes de pontos de dados de localização GPS.
Essa é uma grande melhoria de desempenho se você tiver certeza de que suas linhas estão entre os TOP 5% mais recentes da tabela, por exemplo. De modo que, mesmo que existam índices nas Tabelas, ele limita ainda mais as possibilidades a apenas 5% das linhas em tabelas que possuem mais de 100 milhões ou mais de 1 bilhão de linhas. Esse é especialmente o caso quando Dados Antigos exigirão leituras de Disco Físico e não apenas Memória Lógica leituras da .
Isso é bem mais eficiente que o SELECT TOP | PERCENT | LIMIT, pois não seleciona as linhas, mas limita apenas a parte dos dados a serem pesquisados.
fonte
Para exibir as últimas 3 linhas sem usar
order by
:fonte
Tente usar a
EXCEPT
sintaxe.Algo assim:
fonte
Talvez um pouco tarde, mas aqui está uma seleção simples que resolve sua pergunta.
fonte