Консолидировано: SQL 2005+ динамическая разбивка на страницы с использованием SET ROWCOUNT или RowNumber ()?

У меня сложный SP, который применяет несколько JOIN и поиск, а также включает сложные фильтры, такие как значения, разделенные запятыми, и т. Д. Вдобавок к этому мне нужно развернуть две сложные, но эффективные функции:

1. Динамическая сортировка, но я вижу ее ограниченность - вы знаете длинную / неуклюжую иерархию CASE, странно, что эксперты также согласны с тем, что это единственное «лучшее» решение, которое у нас есть:

Динамическая сортировка в хранимых процедурах SQL http://www.sqlteam.com/forum/topic.asp?TOPIC_ID=5942

В любом случае, я пока не ожидаю многого от этого.

2. Динамическая разбивка на страницы - то есть я хочу, чтобы SP мог возвращать только X записей (X = размер страницы), начиная с Y (Y = номер страницы). Надеюсь, у вас есть общее представление.

Чтобы было понятнее, я хочу использовать что-то доступное в MySQL и PostgreSQL:

[LIMIT { number | ALL }] [OFFSET number]

База данных: разбивка на страницы SQL? http://www.sql.org/sql-базаданных/postgresql/manual/query-limit.html

Странно, что такая простая и базовая функциональность НЕ доступна в SQL 2005+ .. или я ошибаюсь (я был бы рад это услышать :-))


Я знал два подхода, которые сочетают в себе компромисс между производительностью и сложностью:

[2.1] Использование функции «RowNumber ()» в SQL 2005 с последующим применением фильтра: (я использовал его раньше)

WHERE (Row BETWEEN (@PageIndex-1) * @PageSize +1 AND @PageIndex* @PageSize)

Но опять же, для этого необходимо создать временную таблицу или использовать предложение WITH. Это также объясняется в: Смещение строки в SQL Server

[2.2] Я нашел несколько новых способов. Один из них - использование

SET ROWCOUNT

http://www.4guysfromrolla.com/webtech/042606-1.shtml

И говорят, что в целом 2.2 эффективнее 2.1. Это? Кроме того, я хотел знать, что происходит, если два пользовательских запроса запускают один и тот же SP дважды одновременно. Я надеюсь, что «SET ROWCOUNT» не будет «совместно использоваться» или «перезаписываться» среди одновременных SP-вызовов. Пожалуйста, подтвердите. Есть ли какие-либо другие моменты по сравнению с 2.1 и 2.2?


person Hemant Tank    schedule 03.11.2009    source источник
comment
ЕСЛИ вы все еще здесь, то в качестве ответа действительно следует публиковать вторую половину вашего сообщения, а не текст вопроса.   -  person Ben Brocka    schedule 19.06.2012
comment
Спасибо, но мне действительно нужны комментарии экспертов по этому поводу. Вот почему я опубликовал свои сводные данные о НИОКР.   -  person Hemant Tank    schedule 21.06.2012


Ответы (1)


Я считаю, что оба подхода хороши, и мы можем выбрать то, что лучше всего соответствует нашим требованиям.


Я знал два подхода, которые сочетают в себе компромисс между производительностью и сложностью:

[2.1] Использование функции «RowNumber ()» в SQL 2005 с последующим применением фильтра: (я использовал его раньше)

WHERE (Row BETWEEN (@PageIndex-1) * @PageSize +1 AND @PageIndex* @PageSize)

Но опять же, для этого необходимо создать временную таблицу или использовать предложение WITH. Это также объясняется в: Смещение строки в SQL Server

[2.2] Я нашел несколько новых способов. Один из них - использование

SET ROWCOUNT

http://www.4guysfromrolla.com/webtech/042606-1.shtml

И говорят, что в целом 2.2 эффективнее 2.1. Это? Кроме того, я хотел знать, что произойдет, если два пользовательских запроса инициируют один и тот же SP дважды одновременно. Я надеюсь, что «SET ROWCOUNT» не будет «совместно использоваться» или «перезаписываться» среди одновременных SP-вызовов. Пожалуйста, подтвердите. Есть ли какие-либо другие моменты по сравнению с 2.1 и 2.2?

person Hemant Tank    schedule 30.08.2012