2009-07-03 6 views
7

В Sql Server 2008 доступно множество параметров для доступа к базе данных через хранимую процедуру. Например, см. here и here.Какой метод поискового вызова (Sql Server 2008) для наилучшей производительности?

ВАРИАНТЫ:

  1. ROW_NUMBER() функция
  2. ROWCOUNT
  3. КУРСОРЫ
  4. временные таблицы
  5. Вложенный SQL запросов
  6. ДРУГАЯ

пейджинга с использованием ROW_NUMBER(), как известно, performance issues:

Пожалуйста, посоветуйте, какой метод подкачки имеет лучшую производительность (для больших таблиц с JOIN и)?

Просьба также предоставить ссылки на соответствующие статьи (материалы), если это возможно.

Thank you.

+0

Вы, вероятно, следует добавить 300 повторений щедрот, чтобы соответствовать уровню детализации вы просите ... –

ответ

3

Один вопрос, на который вы должны ответить, - это показать общее количество строк для конечного пользователя. Чтобы вычислить номер последней страницы, вам также понадобится номер последней строки.

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

Если вам нужен номер последней страницы, вы можете использовать ROW_NUMBER(). Использование временной таблицы будет не намного быстрее, потому что вы не можете использовать предложение LIMIT, сделав эту стратегию эквивалентом вычисления ROW_NUMBER().

+0

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

+0

Спасибо. Для генерации номера страницы потребуется общее количество строк. Метод ROWCOUNT представляется самым быстрым, но требует уникального столбца сортировки (который не является уникальным в моем случае) – dev

0

Мы можем получить номер строки, используя следующий запрос.

WITH data AS 
(
     SELECT ROW_NUMBER() OVER (order by memberid) AS rowid, memberid 
     FROM Customer 
) 
SELECT *, (select count(*) from data) AS TotalCount 
FROM data 
WHERE rowid > 20 AND rowid <= 30 
+0

OP знает, что он спрашивает, что лучший способ и явно связывается с другим местом, которое описывает проблемы (которые ссылаются на еще одно решение) с этим подходом. –