Оптимизация постраничного вывода в MSSQL 2005
От: ePilgrim  
Дата: 27.02.08 14:56
Оценка:
В базе MSSQL 2005 таблица с 100000000 записей. Необходимо постранично получать данные.
Пробовал реализовать с использование функции ROW_NUMBER():


WITH OrderedObjects as (SELECT field1, field2, ROW_NUMBER() OVER (ORDER BY field1) AS RowNum FROM Table1)
SELECT OrderedObjects.* FROM OrderedObjects WHERE RowNum BETWEEN 10 AND 20



Такой вариант решения имеет существенный недостаток:

т.к. результирующие записи выбираются путем проверки (RowNum BETWEEN 10 AND 20) для каждой записи первого запроса,
то время выполнения будет расти вместе с индексом страницы.

Варианты решения с использованием временных таблиц и курсоров так же будут тормозить при выборе данных с большим индексом страницы.

Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?
Re: Оптимизация постраничного вывода в MSSQL 2005
От: B0rG  
Дата: 27.02.08 15:49
Оценка:
Здравствуйте, ePilgrim, Вы писали:

P>В базе MSSQL 2005 таблица с 100000000 записей. Необходимо постранично получать данные.

P>Пробовал реализовать с использование функции ROW_NUMBER():

на мой взгляд постраничный вывод таких записей непрактичен, бо даже по 100 записей мы получаем 1 000 000 страниц...

Может стоит ввести категоризацию — и фильтровать по категориям?
Или хранить номер страницы в базе если сортинг не нужен?
Re: Оптимизация постраничного вывода в MSSQL 2005
От: wildwind Россия  
Дата: 27.02.08 16:42
Оценка:
Здравствуйте, ePilgrim, Вы писали:

P>Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?


Тут
Автор(ы): Иван Бодягин
Дата: 07.02.2004
Уникальная идентификация записей в таблице, является практически основой реляционных СУБД. Вообще в реляционной теории предполагается, что если две записи ни чем друг от друга не отличаются, то это явная избыточность, и количество таких записей можно сократить до одной. Собственно вопросам этой самой идентификации, каковых возникает на удивление много, и посвящен этот FAQ.
есть кое-что.
Re: Оптимизация постраничного вывода в MSSQL 2005
От: IB Австрия http://rsdn.ru
Дата: 27.02.08 18:40
Оценка:
Здравствуйте, ePilgrim, Вы писали:

P>т.к. результирующие записи выбираются путем проверки (RowNum BETWEEN 10 AND 20) для каждой записи первого запроса,

P>то время выполнения будет расти вместе с индексом страницы.
Не должно, к тому же дальше третьей страницы обычно не ходят.

P>Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?

Можно еще вставить TOP в первую выборку.
Но вообще, если внимательно посмотреть на план запроса, то станет понятно, что это вообще самый оптимальный способ обеспечить постраничную выборку. Больше оптимизаций уже не навернешь, ни в сиквеле, ни где-либо еще.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[2]: Оптимизация постраничного вывода в MSSQL 2005
От: ePilgrim  
Дата: 01.03.08 02:00
Оценка:
Здравствуйте, B0rG, Вы писали:

BG>Может стоит ввести категоризацию — и фильтровать по категориям?


скорее всего это наиболее подходящий вариант. просто постраничный вывод не сильно эффективен на большом кол-ве записей.

BG>Или хранить номер страницы в базе если сортинг не нужен?


сортинг нужен. поэтому такой вариант отпадает.
Re[2]: Оптимизация постраничного вывода в MSSQL 2005
От: ePilgrim  
Дата: 01.03.08 02:01
Оценка:
Здравствуйте, wildwind, Вы писали:

P>>Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?


W>Тут
Автор(ы): Иван Бодягин
Дата: 07.02.2004
Уникальная идентификация записей в таблице, является практически основой реляционных СУБД. Вообще в реляционной теории предполагается, что если две записи ни чем друг от друга не отличаются, то это явная избыточность, и количество таких записей можно сократить до одной. Собственно вопросам этой самой идентификации, каковых возникает на удивление много, и посвящен этот FAQ.
есть кое-что.



полезная информация. спасибо за ссылку
Re[2]: Оптимизация постраничного вывода в MSSQL 2005
От: ePilgrim  
Дата: 01.03.08 02:06
Оценка:
Здравствуйте, IB, Вы писали:

P>>Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?

IB>Можно еще вставить TOP в первую выборку.
IB>Но вообще, если внимательно посмотреть на план запроса, то станет понятно, что это вообще самый оптимальный способ обеспечить постраничную выборку. Больше оптимизаций уже не навернешь, ни в сиквеле, ни где-либо еще.

использование TOP в первой выборке, как и дополнительная фильтрация по категориям преследует цель минимизации начального объема записей.
я Вас правильно понял?
Re: Оптимизация постраничного вывода в MSSQL 2005
От: VGn Россия http://vassilsanych.livejournal.com
Дата: 01.03.08 09:53
Оценка:
P>Существует ли какой-то более оптимальный способ для постраничного выбора данных на MSSQL 2005?

Если есть возможность, то проще постранично брать на этапе фетчинга, тогда таких проблем не будет.
... << RSDN@Home 1.2.0 alpha 2 rev. 840>>
Re[3]: Оптимизация постраничного вывода в MSSQL 2005
От: IB Австрия http://rsdn.ru
Дата: 03.03.08 13:38
Оценка:
Здравствуйте, ePilgrim, Вы писали:

P>использование TOP в первой выборке, как и дополнительная фильтрация по категориям преследует цель минимизации начального объема записей.

P>я Вас правильно понял?
Да.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.