Comments 23
Шел 2011 год… В MS SQL Server появились offset… :)
Да, долгожданный функционал. Простой и удобный… наконец-то!
Тем не менее синтаксис ужасен. К чему там вот это вот «Rows», как будто там может быть что-то другое.
Даже автор немного запутался и в одном месте написал «Row»
LIMIT [offset,] row_count мне нравится гораздо больше
Даже автор немного запутался и в одном месте написал «Row»
LIMIT [offset,] row_count мне нравится гораздо больше
в оракл такого еще нет :)
знаете какие костыли придумывались, для того чтобы выводить последние 1000 записей?
знаете какие костыли придумывались, для того чтобы выводить последние 1000 записей?
У меня тоже ощущение дежавю.
ну наконец-то они сделали эту простую штуку. Больше не надо извращений с ROW_NUMBER(). Ура!
А вот интересно, если на Denali выполнить скрипт 2 (который для SQL 2005/2008) — будет отличие по CPU time или нет?
Т.е. не является ли уменьшение CPU time следствием улучшения оптимизатора запросов, а не того, что Offset как-то хитро на уровне ядра выполняется?
Т.е. не является ли уменьшение CPU time следствием улучшения оптимизатора запросов, а не того, что Offset как-то хитро на уровне ядра выполняется?
Не понял почему последний запрос вернет именно 10 первых строк…
Хм, вы правы, результат будет обратный Top(10). Недочет мой как переводчика, не проверил. Сделаю ремарку что неправда и надо писать так
что уже как-то смотрится не очень хорошо.
Select
[Person ID]
,[Person Name]
,Age
,DOB
,Address
From dbo.tblSample
Order By Age Desc
Offset 0 Rows Fetch Next 10 Rows Only;
что уже как-то смотрится не очень хорошо.
Мда, ну наконец-то! Осталось теперь заставить админа переставить SQL сервер.
Пример для SQL 2000 с постраничным выбором данных изначально написан не оптимальным образом, именно поэтому он и работает медленнее всех.
Я сталкивался с необходимостью организации постраничного просмотра на SQL 2000 для очень больших таблиц (сотни миллионов строк) — его тоже можно заставить работать очень и очень быстро.
Для этого надо сделать следующее:
1. В таблицу #Temp надо вставлять не весь набор записей, а только первые (@RowSkip+ @RowFetch) записи — остальные там просто не нужны.
Очень помогает уменьшить время.
Правда для этого придется писать генеренный запрос и использовать exec, но это не проблема, если уж пришлось писать для SQL 2000.
2. В #Temp надо вставлять опять же не поля, а только поле [Person ID]. Это будет работать намного быстрее — лишние данные не будут гонятся из таблицы в таблицу.
Затем уже в выборке искомых данных надо добавить join таблиц #Temp и tblSample по полю [Person ID] и вернуть в результате запроса выборку полей из таблицы tblSample.
Я сталкивался с необходимостью организации постраничного просмотра на SQL 2000 для очень больших таблиц (сотни миллионов строк) — его тоже можно заставить работать очень и очень быстро.
Для этого надо сделать следующее:
1. В таблицу #Temp надо вставлять не весь набор записей, а только первые (@RowSkip+ @RowFetch) записи — остальные там просто не нужны.
Очень помогает уменьшить время.
Правда для этого придется писать генеренный запрос и использовать exec, но это не проблема, если уж пришлось писать для SQL 2000.
2. В #Temp надо вставлять опять же не поля, а только поле [Person ID]. Это будет работать намного быстрее — лишние данные не будут гонятся из таблицы в таблицу.
Затем уже в выборке искомых данных надо добавить join таблиц #Temp и tblSample по полю [Person ID] и вернуть в результате запроса выборку полей из таблицы tblSample.
очередь за ораклом
Не понимаю почему не захотели сделать в формате: LIMIT offset, count
Синтаксис хуже не придумаешь =(
Синтаксис хуже не придумаешь =(
Все больше люблю Firebird
Странные костыли, LIMIT гораздо удобнее.
Не понимаю чем неудобен where rownum between 100 and 200…
Поясните?
Поясните?
Sign up to leave a comment.
MS SQL 2011 – новый оператор Offset