Как улучшить производительность разбивки на страницы ASP.Net Dynamic Data - PullRequest
3 голосов
/ 30 августа 2011

Я использую ASP.Net Dynnamic Data (.Net Framework версия 4.0) и SQL Server 2008 для отображения данных из набора таблиц.В базе данных есть определенная главная таблица, содержащая 83 столбца с 854581 строками данных, и ожидается, что она будет расти.

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

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

Обратите внимание, что я оптимизировал запрос для последней страницы с помощью помощника по настройке базы данных, который не дал мне никаких советов.

Я попытался выполнить очень простой запрос, используя row_number(), чтобысм. последнюю страницу, аналогичную приведенному ниже запросу:

SELECT TOP 10* FROM 
    (SELECT *, row_number() OVER (ORDER BY [Primary Key Column] ASC) AS [rn]
     FROM [Master Table]) AS TB1
WHERE TB1.rn > 854580

При выполнении первого запроса вышеупомянутый запрос занимал около 20 секунд, в то время как служба SQL Server sqlservr.exe израсходовала 1700 КБ памяти(Я использую 32-битные окна без специальных переключателей ядра, поэтому каждый процесс имеет максимум 2 ГБ адресного пространства).

Итак, мой вопрос, есть ли более эффективный способ, чем использование row_number() сделать разбиение на страницы в динамических данных ASP.Net и как его реализовать.

Я предложил две возможности:

  1. Существует некоторый волшебный язык T-SQLнапример, в MySQL создайте с более высокой производительностью что-то вроде LIMIT <From row number>, <To row number>.
  2. Я добавляю столбец порядкового номера в таблицу и страницы в соответствии с этим номером, когда нет фильтрации или сортировки

Возможно, большая проблема заключается в том, как реализовать эту пользовательскую подкачку в динамических данных ASP.Net.Любая помощь приветствуется, даже образцы нумерации страниц, не предназначенные для повышения производительности, просто чтобы дать мне представление.

Примечание: Я не могу изменить используемый движок базы данных, поэтому нерекомендую MySQL или PostgreSQL или что-нибудь подобное.

1 Ответ

0 голосов
/ 02 сентября 2011

20 секунд длинно даже для 1 миллиона строк - проверьте индексы SQL Server!

Также убедитесь, что вы извлекаете только те столбцы данных, которые требуются в представлении списка.(вы упомянули 83 столбца .... вы не отображаете все эти элементы в представлении списка.

Другой подход, который я могу придумать, - это использовать выражения запроса Linq с Skip () и Take () длястраница на время разбивки на страницы. Конечно, это означает, что вы будете запрашивать меньше данных, чаще.

...