Во-первых, почему DBCC DROPCLEANBUFFERS;
? Это жесткий холодный сброс пула буферов. Если вы не хотите измерять и настраивать производительность ввода-вывода своих жестких дисков, никто не заботится о производительности холодного кэша. Это не как ваша система будет работать. Кэширование страниц в пуле буферов является наиболее важным аспектом производительности в базах данных , и вы это исправите. Это все равно что показываться в Ferrari без двигателя и спрашивать, почему так медленно. Для измерения производительности вы должны сделать ровно напротив : выполнить запрос 4-5 раз, чтобы прогреть кеш, а затем измерить.
Во-вторых, какова ваша структура таблицы? Является ли таблица Account.Customer
порядком индекса кластера таблицы на Record_id
? Если нет, вы никогда не получите желаемой производительности независимо от того, как вы выражаете свой T-SQL.
И последнее, но не менее важное: какая у вас система? Достаточно ли оперативной памяти для кэширования всей базы данных в памяти? Если нет, купите больше оперативной памяти. Существуют ли другие процессы, которые конкурируют за память, такие как IIS / Asp? Если да, выкиньте их на свой собственный сервер, и вам никогда не следует запускать базу данных на том же хосте, что и веб-сервер, , если важна производительность.
Для альтернативного быстрого пейджинга рассмотрите решения на основе набора ключей:
/* moving up */
SELECT top(@Page_Size) *
FROM Account.Customer
WHERE Record_Id > @lastPageRecordId
ORDER BY Record_Id;
/* moving down */
SELECT top(@Page_Size) *
FROM Account.Customer
WHERE Record_Id < @firstPageRecordId
ORDER BY Record_Id DESC;
Решение, управляемое набором ключей, может искать прямо до последней позиции, а затем сканировать диапазон на следующей / предыдущей странице, используя позицию ключа кластеризованного индекса. Логика пейджинга (состояние) должна помнить последние и первые клавиши на отображаемой странице, чтобы продолжить оттуда, вместо запоминания номера страницы.
Решения на основе Rowcount (а также LIMIT в MySQL) менее эффективны, чем решения на основе набора ключей, потому что они всегда должны считать записи, чтобы позиционировать себя, вместо того, чтобы искать прямо в позиции, как это могут делать наборы ключей.