Постраничный вывод записей [скорость работы]

Дядя Петя
Дата: 11.06.2006 19:47:46
Есть ли различия с точки зрения производительности в подходах к постраничному выводу записей:
1) rownum с последующим between ... and ...
2) использование свойств PageSize и AbsolutePage класса ADODB.Recordset

Просто один спец говорит, что при использовании второго метода, происходит чтение всего отобранного множества и это может тормозить работу приложения (сайта).
MElin
Дата: 11.06.2006 20:16:51
при правильном использовании конечное rownum, потому как PageSize и AbsolutePage класса ADODB.Recordset подразумевает перенос данных на клиента.

Но один минус - работа с rownum требует некоторых уилий и простым битвином не обойтись.
Дядя Петя
Дата: 11.06.2006 20:21:26
все-таки PageSize и AbsolutePage приводят к переносу данных на клиента?
Т.е. если запрос возращает миллион строк, то все они будут передаваться клиенту или нет ?
andrey_anonymous
Дата: 11.06.2006 20:31:22
Дядя Петя
все-таки PageSize и AbsolutePage приводят к переносу данных на клиента?
Т.е. если запрос возращает миллион строк, то все они будут передаваться клиенту или нет ?

"Непраааально ты, Дядя Федор, бутерброд ешь..." (с) Матроскин.

В смысле - некорректно вопрос ставите, Дядя Петя.
Поскольку он не в том, "будут ли все они передаваться", но в том, сколько записей клиент вытянет для реализации логики.
Oracle Forms, for ex., фетчит минимально необходимое количество записей, а те, что уже вытянул - кэширует.
grexhide
Дата: 11.06.2006 20:39:44
andrey_anonymous


И не забыть про связь PageSize и размером массива при получении данных на клиенте. И про его связь с consistent gets, кстати, тоже.

+ контекст - мы имеем дело с web сервером и обезличенными сессиями. Грубо говоря - получил ответ, будь здоров, гуляй дальше до следующего запроса.
grexhide
Дата: 11.06.2006 20:53:51
Дядя Петя
все-таки PageSize и AbsolutePage приводят к переносу данных на клиента?
Т.е. если запрос возращает миллион строк, то все они будут передаваться клиенту или нет ?


Клиенту - нет, а вот Web серверу, возжможно, что и да. При том, что первому стукнет в голову - посмотреть 22342-ую страницу запроса (тут уж, действительно, без rownum - никак. но и between - это не совсем не тот способ.... )

грубо говоря, нужно примерно вот так:

SELECT * FROM 
(
  SELECT /*+ FIRST_ROWS*/ i.*, ROWNUM int_rownum 
  FROM   table i 
  WHERE  .... AND 
    ROWNUM <= (:Page + 1) * :PageSize)
) e
WHERE e.int_rownum >= (:Page * :PageSize)

Спросите почему ?
SY
Дата: 11.06.2006 21:11:59
grexhide
грубо говоря, нужно примерно вот так:

SELECT * FROM 
(
  SELECT /*+ FIRST_ROWS*/ i.*, ROWNUM int_rownum 
  FROM   table i 
  WHERE  .... AND 
    ROWNUM <= (:Page + 1) * :PageSize)
) e
WHERE e.int_rownum >= (:Page * :PageSize)


Extremely "грубо говоря". First of all, it should be:

SELECT * FROM 
(
  SELECT /*+ FIRST_ROWS*/ i.*, ROWNUM int_rownum 
  FROM   table i 
  WHERE  .... AND
     ROWNUM <= :Page * :PageSize
) e
WHERE e.int_rownum > (:Page - 1) * :PageSize

And secondly, it does not make much sense without ORDER BY.

SY.
grexhide
Дата: 11.06.2006 21:23:08
SY


:Page = 0 ?
SY
Дата: 11.06.2006 21:28:10
grexhide
:Page = 0 ?


???

If :PAGE=5 and :PAGESIZE=10, whe need rows <= 5 * 10 and > 4 * 10, not rows <= 6 * 10 and > 5 * 10

SY.
grexhide
Дата: 11.06.2006 21:33:33
SY
grexhide
:Page = 0 ?


???

If :PAGE=5 and :PAGESIZE=10, whe need rows <= 5 * 10 and > 4 * 10, not rows <= 6 * 10 and > 5 * 10

SY.


Ну... насчет > <= против >= <= +/- согласен. Хотя, в данном случае, не столь критично (даже +, если мы видим первую и последнюю запись, по аналогии с листанием страниц в любом текстовом редакторе, к примеру - в Far Manager).

Но не мной придумано нумерацию чего-либо начинать с нуля.