Это известный вопрос, но лучшее решение, которое я нашел, это что-то вроде:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
У меня есть таблица с множеством строк. Невозможно использовать этот запрос, потому что он занимает много времени. Итак, как я могу сделать, чтобы выбрать последние N строк без использования ORDER BY?
РЕДАКТИРОВАТЬ
Извините, дублированный вопрос об этом
id
он проиндексирован, он просто отсканирует этот индекс в обратном порядке и остановится после первых 5 строк. Если он не проиндексирован, ему нужно будет выполнитьTOP N
сортировку. Это не будет хуже, чем любой другой способ сделать это. Он не сортирует всю таблицу (хотя нужно будет сканировать всю таблицу)Ответы:
Вы также можете сделать это, используя функцию ROW NUMBER BY PARTITION. Отличный пример можно найти здесь :
источник
Вы можете заставить сервер SQL выбирать последние N строк, используя этот SQL:
источник
Я тестировал код JonVD, но обнаружил, что он очень медленный, 6 с.
Этот код занял 0 с.
источник
OrderDate
проиндексированы, то по сути одинаково быстро можно выбрать первые или последние N строк запроса. Я понимаю, что есть шансOrderDate
хорошо коррелировать с введенным заказом, но это в лучшем случае побочный эффект, и все равно требуется сканирование таблицы, не так ли? (И я не думаю, что это отвечает на то, на что ОП указывает, как на лучшую формулировку своего вопроса : т.е. без сортировки)Если вы хотите выбрать последние номера строк в таблице.
Синтаксис будет как
Эти заявления работают, но по-разному. Спасибо вам, ребята.
таким образом, вы можете получить последние 10 строк, но порядок покажет убывание
источник
В общих чертах и для поддержки SQL-сервера здесь есть
и для производительности это неплохо (менее одной секунды для более чем 10000 записей на сервере)
источник
Индексируется ли "Id"? Если нет, то это важная вещь (я подозреваю, что она уже проиндексирована).
Кроме того, вам нужно вернуть все столбцы? Вы можете добиться существенного улучшения в скорости, если вам на самом деле нужно только меньшее подмножество столбцов, которые могут ПОЛНОСТЬЮ удовлетворяться с помощью индекса в столбце ID - например, если у вас есть NONCLUSTERED индекс в столбце Id, без других Поля, включенные в индекс, должны были бы выполнить поиск по кластерному индексу, чтобы фактически получить остальные столбцы для возврата, и это могло бы составить большую часть стоимости запроса. Если это индекс CLUSTERED или индекс NONCLUSTERED, который включает в себя все другие поля, которые вы хотите вернуть в запросе, то все будет в порядке.
источник
Сначала вы получите наибольшее количество записей от
А потом :
В SQL Server 2012
В SQL Server 2008
источник
Вот что вы можете попробовать без,
order by
но я думаю, что это требует, чтобы каждый ряд был уникальным.N
это количество строк, которое вы хотите,L
это количество строк в таблице.Как отмечалось ранее, какие строки возвращаются, не определено.
РЕДАКТИРОВАТЬ: это на самом деле собака медленно. Не имеет значения на самом деле.
источник
источник
Этот запрос возвращает последние N строк в правильном порядке, но его производительность низкая
источник
используйте desc с orderby в конце запроса, чтобы получить последние значения.
источник
Возможно, это не совсем подходит для вопроса, но ...
Предложение OFFSET
Предложение
OFFSET number
позволяет пропустить номер строк, а затем вернуть строки после этого.Эта ссылка на документ является Postgres; Я не знаю, относится ли это к Sybase / MS SQL Server.
источник
источник
MS не поддерживает LIMIT в t-sql. В большинстве случаев я просто получаю МАКС (ID) и затем вычитаю.
Это вернет менее 10 записей, если идентификатор не является последовательным.
источник
Техника, которую я использую для запроса самых последних строк в очень больших таблицах (100+ миллионов или 1+ миллиардов строк) , ограничивает запрос «чтением» только самого последнего «N» процента от RECENT ROWS. Это приложения реального мира, например, я делаю это для неисторических недавних данных о погоде или недавних поисков в новостной ленте или недавних данных о точках данных о местоположении GPS.
Это огромное улучшение производительности, если вы точно знаете, что ваши строки находятся в последних 5% ТОП таблицы, например. Таким образом, даже если в таблицах есть индексы, это дополнительно ограничивает возможности только 5% строк в таблицах, которые имеют более 100 миллионов или более 1 миллиарда строк. Это особенно актуально, когда для старых данных требуются чтения с физического диска, а не только чтения из логической памяти .
Это намного эффективнее, чем SELECT TOP | ПРОЦЕНТ | LIMIT, так как он не выбирает строки, а просто ограничивает часть данных, подлежащих поиску.
источник
Для отображения последних 3 строк без использования
order by
:источник
Попробуйте использовать
EXCEPT
синтаксис.Что-то вроде этого:
источник
Может быть, немного поздно, но вот простой выбор, который решит ваш вопрос.
источник