Pull to refresh

Comments 23

Шел 2011 год… В MS SQL Server появились offset… :)
Да, долгожданный функционал. Простой и удобный… наконец-то!
Тем не менее синтаксис ужасен. К чему там вот это вот «Rows», как будто там может быть что-то другое.
Даже автор немного запутался и в одном месте написал «Row»
LIMIT [offset,] row_count мне нравится гораздо больше
Ну хоть топик стоило почитать, прежде чем комментировать:
Неважно, какое слово использовать после указания количества строк: Row или Rows – они синонимы в данном случае.
Синтаксис вполне логичен — сместить на 10 строк — offset (10) Rows
в оракл такого еще нет :)

знаете какие костыли придумывались, для того чтобы выводить последние 1000 записей?
UFO just landed and posted this here
Неа. приходится использовать rownum и конструкции аля

ну наконец-то они сделали эту простую штуку. Больше не надо извращений с ROW_NUMBER(). Ура!
А вот интересно, если на Denali выполнить скрипт 2 (который для SQL 2005/2008) — будет отличие по CPU time или нет?
Т.е. не является ли уменьшение 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 сервер.
Не торопитесь. Пока только первая CTP-версия (Community Technology Preview) вышла. Там еще часть функционала не реализована и баги не отлажены.
Пример для SQL 2000 с постраничным выбором данных изначально написан не оптимальным образом, именно поэтому он и работает медленнее всех.

Я сталкивался с необходимостью организации постраничного просмотра на SQL 2000 для очень больших таблиц (сотни миллионов строк) — его тоже можно заставить работать очень и очень быстро.

Для этого надо сделать следующее:
1. В таблицу #Temp надо вставлять не весь набор записей, а только первые (@RowSkip+ @RowFetch) записи — остальные там просто не нужны.
Очень помогает уменьшить время.
Правда для этого придется писать генеренный запрос и использовать exec, но это не проблема, если уж пришлось писать для SQL 2000.

2. В #Temp надо вставлять опять же не поля, а только поле [Person ID]. Это будет работать намного быстрее — лишние данные не будут гонятся из таблицы в таблицу.

Затем уже в выборке искомых данных надо добавить join таблиц #Temp и tblSample по полю [Person ID] и вернуть в результате запроса выборку полей из таблицы tblSample.
P.S. Все вышесказанное не умаляет достоинств новых команд.
Но их производительность, на самом деле, надо бы оценить в более боевых условиях, чем предложенные в статье.
Не понимаю почему не захотели сделать в формате: LIMIT offset, count
Синтаксис хуже не придумаешь =(
да. особенно угнетает
where rownum>10 and rownum<50
Странные костыли, LIMIT гораздо удобнее.
Не понимаю чем неудобен where rownum between 100 and 200…

Поясните?
Так тем, что это Microsoft. Если бы они сделали по другому — сверху написали бы что «between» гораздо удобнее.
Sign up to leave a comment.

Articles