У меня есть Employee
таблица с одним миллионом записей. У меня есть следующий SQL для подкачки данных в веб-приложении. Работает нормально. Однако, что я вижу как проблему - производная таблица tblEmployee
выбирает все записи в Employee
таблице (для создания MyRowNumber
значений).
Я думаю, что это вызывает выбор всех записей в Employee
таблице.
Это действительно так работает? Или SQL Server оптимизирован для выбора только 5 записей из исходной Employee
таблицы?
DECLARE @Index INT;
DECLARE @PageSize INT;
SET @Index = 3;
SET @PageSize = 5;
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize
Ответы:
Альтернативой тестированию может быть:
Да, вы дважды попали в таблицу, но в CTE, где вы сканируете всю таблицу, вы берете только ключ, а не ВСЕ данные. Но вы действительно должны посмотреть на эту статью:
http://www.sqlservercentral.com/articles/T-SQL/66030/
И последующее обсуждение:
http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx
В SQL Server 2012, конечно , вы можете использовать новый
OFFSET
/FETCH NEXT
синтаксис:источник
Хотя вы можете не знать механизм, стоящий за ним, вы можете проверить это самостоятельно, сравнив производительность вашего запроса с: select * from Employee.
Более поздние версии SQL Server довольно хорошо оптимизируют работу, но это может зависеть от нескольких факторов.
Работа вашей функции ROW_NUMBER будет зависеть от предложения Order By. В вашем примере большинство предположит, что EmpID является первичным ключом.
В некоторых случаях такие предложения, которые являются настолько сложными и / или плохо закодированными или проиндексированными, вам может быть лучше просто вернуть весь набор данных (это редко и может быть исправлено). Использование МЕЖДУ имеет проблемы.
Прежде чем предполагать, что было бы лучше вернуть все строки в ваше приложение и дать ему понять, вам следует поработать над оптимизацией запроса. Проверьте оценки. Спросите анализатор запросов. Проверьте некоторые альтернативы.
источник
Я знаю, что вопрос касается row_number (), но я хочу добавить одну новую функцию sql server 2012. В sql server 2012 появилась новая функция OFFSET Fetch, и она очень быстрая, чем row_number (). Я использовал это, и это дает мне хороший результат, надеюсь, что вы, ребята, тоже воспользуетесь этим.
Я нашел один пример на http://blogfornet.com/2013/06/sql-server-2012-offset-use/
что полезно. Надеюсь, это поможет вам и для реализации новых функций ....
источник
Я не думаю, что он возвращает все строки в исходной таблице. SQL сервер оптимизирует. В противном случае для выбора миллиона записей потребуется огромное количество времени. В настоящее время я использую это, и это намного быстрее, чем выбор всех строк. Так что, конечно, не получить все строки. Однако это медленнее, чем просто выборка первых пяти строк, вероятно, из-за времени, затраченного на упорядочение
источник
источник