Алоха!
Мабудь у всіх поставала проблема реалізації почастинного перегляду даних, які зберігаються в БД. Стандартний DataGrid робить це настільки криво (моє ІМХО!), що використовувати цю функцію у ньому - майже смертельний гріх! Тому приходиться реалізовувати такий функціонал своїми руками :(
І так, перша ідея, яка приходить в голову (і як показує практика, переходить в реалізацію) буде описана такими пунктами:
1. Вибрати з потрібної нам таблиці PageNum*PageSize записів в якусь тимчасову таблицю
2. Видалити з тимчасової таблиці перші (PageNum - 1)*PageSize записів
3. Те що залишиться, видати як результат сторінки з номером PageNum
Примітка: PageNum - номер сторінки, яку треба показати (нумерація сторінок починається з "1"); PageSize - кількість записів на сторінці
В принципі, це все прекрасно працює... але на невеликих обємах даних! (до речі, 99% тестерів проводять тестування пейджингу на обємах таблиць у 1000-2000 записів, що дає прекрасні часові результати!)
Тепер уявимо собі, що в таблиці є 500 000 записів і нам потрібно вибрати записи з 399 990 по 400 000... Результатом вибірки буде перевищення усіх можливих таймаутів :( Що ж нам робити?! Читати далі...
Реалізація нового алгоритму описується наступними пунктами:
1. Подивитись в Books Online що таке курсори
2. Реалізувати механізм вибірки на їх основі :)
Для тих хто не зрозумів (або кому не хочеться читати мануали) приводжу спрощений приклад:
DECLARE temp_cursor SCROLL CURSOR FOR
select [ID]
from [Profile]
where [SomeCriteria] = 1
declare @counter int
declare @id int
OPEN temp_cursor
FETCH NEXT FROM temp_cursor
into @id
set @counter = 0
WHILE @@FETCH_STATUS = 0 AND @counter < 10
BEGIN
insert into @temp ( [id] ) values ( @id )
set @counter = @counter + 1
FETCH NEXT FROM temp_cursor
into @id
END
CLOSE temp_cursor
DEALLOCATE temp_cursor
select mp.[ID],
mp.[LoginName]
from [Profile] as mp
where mp.[ID] in ( select [id] from @temp )
Для тих хто до цього часу вірить в те, що перший варіант реалізації покаже співрозмірні часові результати з реалізацією на курсорах - перевірте на 1 млн записів)))
Для ти хто думає, що вибірка 10-20 записів з 1 млн ніколи не буде потрібна скажу, що такі системи існують і прекрасно функціонують)))
UPDATE (27.11.2007)