|
|
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. У меня возникла ситуация: Есть некая таблица с пейджингом. Для выборки используется фильтрация по полям. Записей в базе десятки милионов. Проблема в том что при обычной схеме пейджинга (2 запроса: count(*) и запрос данных) на таких объёмах данных тормозит. При этом второй запрос естественно ограничен количеством записей отображаемых на странице (например 25). Но запрос общего количества естественно без этого ограничения, но с фильтрацией. Объёмы огромные а пейджинг нужен. как выкрутиться? здесь нужно применить математику, но каким боком не понимаю. как расчитать номер страницы, и есть ли страницы до и после если не знать общего количества записей в выборке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 15:31:39 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
c-project, На разных серверах БД, например MS SQL (даже 2000 от 2005 отличается), MySQL пейжинг по разному реализован. У Вас что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 17:13:40 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
c-project, AFAIK, никак. Достаточно легко можно узнать, есть ли следующая и есть ли предыдущая страница. Если нужно узнать количество страниц и номер текущей, без COUNT в той или иной форме (например, в MySQL SQL_CALC_FOUND_ROWS - правда иногда работает даже медленнее отдельного запрос) не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 17:53:29 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
ShSerge, в моём случае db2 v8. да. на самом деле без COUNT как не крути не обойтись. хотя можно этот фрагмент оптимизировать. Например после поиска с фильтрацией положить во временную таблицу, потом по ней посчитать COUNT и сделать выборку с ограничением. Но это спорно и нужно тестировать, т.к. может оказаться что пользователь не указал фильтры и тогда вся таблица целиком будет копироваться во временную. У меня уже спортивный интерес. Даже если я откажусь от такого пейджинга в этой системе, поэксперементировать интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 18:33:30 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
а слабо на триггерах количество считать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 22:50:57 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
да и вообще когда больше трех страниц можно количество не выводить. ибо все равно никто столько смотреть не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 22:52:14 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
ScareCrow, читайте внимательно, фильтрация произвольная - 1 поле с 2 DISTINCT значениями - 2 предрасчета, 2 поля каждое с 2 DISTINCT значениями = 2 * 2 предрасчета. И так далее. В итоге получится, что на один INSERT придется предрассчитывать сотни COUNTов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 23:17:33 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
c-project, Пардон, на DB2 я - не джедай. Хотя не сомневаюсь, что там есть средства не хуже, чем в MS SQL или MySQL. ПС. COUNT(*) здесь не при чём. Имеются во всех (которые я знаю) БД специальные средства для пейжинга. Кстати, COUNT(*) выполняется мгновенно, независимо сколько десятков миллионов записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2010, 23:39:21 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
ShSerge, если имеется в виду SQL_CALC_FOUND_ROWS в MySQL и аналоги в других БД, то оно работает не всегда быстрее COUNT(*) отдельным запросом, а иногда даже медленее. И COUNT(*) не всегда отрабатывает мгновенно - вы, наверное, распространяете случай выборки SELECT COUNT(*) FROM t в MySQL над MyISAM таблицей, где количество записей берется напрямую из информации о таблице, а не подсчитывается - с тем же InnoDB такой финт уже не получится. Как минимум в MS SQL и Oracle ситуация, AFAIK, обстоит не лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2010, 00:41:36 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
ShSerge ... Кстати, COUNT(*) выполняется мгновенно, независимо сколько десятков миллионов записей. На произвольном запросе? Это вы погорячились, погорячились... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2010, 08:30:25 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
а зачем тебе такие объемы на клиенте нужны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2010, 09:49:20 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
MasterZivа зачем тебе такие объемы на клиенте нужны? Нет. такие объёмы мне на клиенте не нужны. Для ограничения есть фильтры, которые указывает пользователь. Но он может указать их мало. В итоге результат сожет быть огромным, поэтому есть пейджинг. и на клиента загружается только одна страница, а не все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2010, 08:23:55 |
|
||
|
Пейджинг на больших объёмах данных
|
|||
|---|---|---|---|
|
#18+
c-project wrote: > Нет. такие объёмы мне на клиенте не нужны. Для ограничения есть фильтры, > которые указывает пользователь. Но он может указать их мало. В итоге > результат сожет быть огромным, поэтому есть пейджинг. и на клиента > загружается только одна страница, а не все. Так ПОЭТАПНО он будет загружать ВСЁ. А если не будет, то это всё равно, что выдать первые N (N~=100) записей и сказать, что "вообще-то их дофига", или "есть и ещё такие записи". Я вот не понимаю, на кой фиг этот пейджинг... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2010, 18:36:39 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36454494&tid=1343893]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
443ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 773ms |

| 0 / 0 |
