Sql Server Paging проблема - PullRequest
       0

Sql Server Paging проблема

2 голосов
/ 16 ноября 2011

Друзья

Я уже реализовал пейджинг в моем SP -

with MyData As (
    select ROW_NUMBER() over (order by somecolumn desc) AS [Row], 
    x,y,z,...
)
Select x,y,z,...
From MyData
Where [Row] between ((@currentPage - 1) * @pageSize + 1) and (@currentPage*@pageSize)

Проблема здесь в том, что данные повторяются очень быстро, если предложение with возвращает меньшее количество строк, но это занимает много времени, когда миллионы записей. Иногда это истекает.

Есть ли другая альтернатива?

Спасибо, что поделились своим драгоценным временем.

Ответы [ 2 ]

1 голос
/ 18 июня 2013

Причина, по которой ваш запрос медленный, заключается в том, что у вас есть сортировка всей таблицы на каждый запрос.Чтобы значительно ускорить его, вам нужно избегать сортировки большого объема данных по стоимости процессора, жесткого диска / памяти или ограничений по логике разбиения на страницы.

Поскольку информации о том, как сортируется таблица, и если вывставляйте посередине / удаляйте записи очень часто, я сузю ваш вопрос, сделав следующие предположения:

  1. Я думаю, у вас есть таблица с архивом статей.Новые записи в основном находятся внизу таблицы, записи из середины таблицы редко удаляются.

  2. Вы всегда сортируете по одному и тому же столбцу somecolumn и в том же порядке, напримерпо убыванию.

  3. У вас нет введенных пользователем фильтров (например, заголовок статьи или автор).

Это делает таблицу статической с точки зрениявывод: каждая статья будет на том же месте, если не вставлена ​​новая.Новый пришел на вершину вашего выхода.Затем вы можете сохранить ROW_NUMBER() OVER () как столбец.Более удобным решением будет столбец IDENTITY.Это ускорит процесс, если вы создадите кластеризованный индекс для этого столбца

alter table add [Record_Number] int null IDENTITY 

Этот новый столбец добавляется как null, чтобы вы могли заполнять значения в первый раз.Тогда вы можете сделать это not null.

С другой стороны, вы можете очень быстро набрать номер строки на

select @Max_Row =  SELECT MAX(row_number) from MyTable

Теперь, когда у вас есть общее количество строк, размер страницы и номер страницыВы можете выбрать нужные строки в одном операторе, не сортируя всю партию.

Select * From MyTable 
Where row_number between 
    (@Max_Row - @Page * @Page_Size) + 1 AND
     @Max_Row -(@Page - 1) * @Page_Size

Если у вас есть фильтр в CTE, то дайте больше информации о том, как структурированы ваши данные, чтобы мы могли подуматьспособа ограничения области применения CTE.

1 голос
/ 18 июня 2013

Оптимизация SQL-сервера - это очень обширная тема, и практически невозможно решить проблему с ограниченным количеством размещенной вами информации.Однако, поскольку вы спешите к решению - во-первых, я бы предложил проверить ваш фактический план выполнения, опубликуйте его здесь и убедитесь, что индекс действительно используется - если это не так, торассмотрите возможность использования табличной подсказки FASTFIRSTROW для принудительного использования индекса - проверьте здесь и здесь о том, как это можно улучшить, и здесь о том, как это можно сделатьхуже.

Следующее, что нужно рассмотреть, - это прослушивание параметров SQL - это маловероятно из того, что вы сказали, но возможная проверка здесь для подробностей введите описание ссылки здесь

Для увеличения производительности в больших масштабахвам, возможно, придется взглянуть на архитектурные изменения как минимум, чтобы убедиться, что ваши журналы транзакций находятся на диске, отличном от ваших данных. Причина, по которой вы отделяете файлы базы данных от файлов журнала, заключается в том, что доступ к базе данных является случайным, а доступ к журналу - последовательным.Согласно рекомендациям, вы не должны смешивать эти два типа ввода-вывода на одном и том же диске

Кроме того, если у вас миллион строк, вам действительно нужно рассмотреть возможность разделения данных на несколько дисков.

Наконец, я бы настоятельно рекомендовал разбить на разделы либо таблицу, либо индекс см. Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...