|
|
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Вопрос по проектированию БД - неплохо бы было получить совет от человека, который сталкивался с похожей ситуацией. Ситуация следующая(объясняю на пальцах): пускай есть некая таблица, например, с городами. Клиент выполнил запрос(пофигу какой - пускай он, скажем, запросил все города России) и в итоге получил идентификаторы, скажем, 100 000 городов. Результат клиенту предоставляется в виде постраничной навигации(т.е., скажем по 100 городов(идентификаторов) на странице). Вопрос: где хранить эти 100 000 идентификаторов городов пока клиент будет осуществлять навигацию по страницам с результатами? Вариант 1: выполнять выборку всех городов России(каждый раз по 100 000 результатов) при каждом запросе страницы с результатами(с ипользованием LIMIT(X, Y)) - не рационально с точки зрения рессурсов. Вариант 2: сохранить эти 100 000 результатов во временную таблицу. Но тут возникает вопрос - сколько такая таблица будет занимать памяти? (ситуация: 20 человек запросили по 100 000 городов, каждому система выделила по временной таблице - судя по всему, количество памяти здесь будет измеряться мегабайтами, что очень много). Вариант 3: хранить результаты в клиентской сессии(считай - временный файл), но - насколько этот вариант оправдан - я не знаю. Получается, что прийдётся каждый раз парсить содержимое этого файла, а, учитывая, что парсить, опять же, прийдётся эти 100 000 идентификаторов - то это уже накладный расход процессорного времени. В общем - где хранить БОЛЬШИЕ временные результаты для каждого клиента? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 01:13 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Обсуждалась тема неоднократно. Ключевой вопрос: зачем клиенту сразу 100 тысяч городов? Если правильный ответ: сразу не надо, то подсказка к решению: клиент не сильно расстроится, если при выборке 2 или 10-ой страницы он увидит не 100 процентов те же данные, которые увидел бы там 5 минут назад... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 03:31 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenkoВ общем - где хранить БОЛЬШИЕ временные результаты для каждого клиента? Спасибо! Их не нужно хранить. Если возник такой вопрос, то значит в Код: plaintext Клиент должен видеть только те данные с которыми он может/сможет работать. Явно сразу с 100 000 записей он работать не будет. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 08:27 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, пересылаете ему все 100тыщ в браузер и организуете постраничную нафигацию js. Быстрее обновит свою тачку... ... технология "толстый клиент". Ну очень толстый... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 08:47 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenkoВ общем - где хранить БОЛЬШИЕ временные результаты для каждого клиента?Если нужно хранить, то понятно, в базе или на клиенте, больше негде. Кроме варианта "не хранить", о котором уже сказали, есть ещё вариант "хранить один экземпляр одинаковых данных". Допустим, найти группы клиентов с одинаковыми фильтрами для городов и хранить один экземпляр временных данных для них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 08:59 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenkoВ общем - где хранить БОЛЬШИЕ временные результаты для каждого клиента? Все пром. системы делают так: при листании вперед считывается очереданя порция (100 записей) из БД и записывается в ОП при листании назад данные берутся из ОП число записей в запросе не играет никакой роли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 09:34 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Делать на клиенте — лучший вариант. Если никак — использовать временную таблицу. Лучше псевдовременную, но это вообще зависит от субд, у всех разные возможности про этому поводу. Но вообще очень все зависит и от запроса, и объема данных, так что из общего правила могут быть частные исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 11:51 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, В общем - где хранить БОЛЬШИЕ временные результаты для каждого клиента? Большие — не хранить нигде. Больших наборов вообще в принципе быть не должно. Если у тебя они есть, то нужно что-то в консерватории править. Запросы переписывать, чтобы давать более детальные критерии отбора, чтобы они давали меньше данных. Большие наборы человек все равно не будет смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 11:57 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
Ой, а что, есть столько городов? :) Шутка. Думаю прежде всего клиенту надо предоставить список стран, потом областей (губерний, штатов) и уже получится городов 50. Ну, а если и этого будет много, то я поступаю так как и на сайтах - вводишь пару буковок, серверу отправляется запрос с пфильтром по подстроке, обычно возвращается совсем простой список из которого и самому клиенту будет удобно выбирать. Я закрываю сайты где этого функционала нет - надо же себя уважать. 100000 городов... Это кто же с таким объёмом информации работает? Может работать? И всё это чтобы выбрать один единственный город? Блин, уже смешно становится, чес слово! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 12:04 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
Ок - спасибо за ответы! Давайте тогда уточню ситуацию. Клиенту, и правда, нет необходимости работать сразу со 100 000 идентификаторов - поэтому я и организовываю для него постраничный вывод(например, по 100 результатов на страницу - представьте себе результаты в Google или Yandex и вы поймете, что я имею ввиду). При этом я НЕ хочу выполнять, при каждом обращении к очередной странице с результатами, комманду вида: SELECT id from Cities where Country = 'Russia' LIMIT(0, 100); - так как это заставит SQL-сервак каждый раз выбирать все записи соответствующие критерию и отбрасывать часть из них потому, что указан LIMIT. Поэтому я и задумался о "хранении" данных, потому, что не хочу постоянно торбить SQL-сервак одинаковыми запросами с LIMIT'ом. авторЕсли правильный ответ: сразу не надо, то подсказка к решению: клиент не сильно расстроится, если при выборке 2 или 10-ой страницы он увидит не 100 процентов те же данные, которые увидел бы там 5 минут назад... А можно поподробнее? авторпри листании вперед считывается очереданя порция (100 записей) из БД и записывается в ОП при листании назад данные берутся из ОП Ну, так получится описанная мною ситуация? - выполняется запрос с LIMIT'ом, данные помещаются в ОП, потом опять запрос с LIMIТ'ом + данные в ОП - мне это кажется крайне непроизводительным - я не прав? P.S. По поводу "городов" и.т.п.: города я привел только для примера; на их месте могло быть что угодно: ложки, чашки, обезьяны - я моделирую ситуацию "на пальцах". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 14:34 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
авторЗапросы переписывать, чтобы давать более детальные критерии отбора, чтобы они давали меньше данных. Это хорошо в теории, но тогда как объяснить вариант с той-же поисковой системой, которая выдаёт в результате поиска по ключевому слову, скажем, 1000 000 результатов? (я сейчас не беру в расчёт технические мощности, облачные технологии и прочее). Я и сам не верю, что поисковик где-то временно сохраняет эти 1000 000 результатов пока длится клиентская сессия - но тогда как это организовано? - хочу взять в толк. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 14:39 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenkoНу, так получится описанная мною ситуация? - выполняется запрос с LIMIT'ом, данные помещаются в ОП, потом опять запрос с LIMIТ'ом + данные в ОП - мне это кажется крайне непроизводительным - я не прав? Запрос выполняется один раз, потом строки считываются из курсора (зависит от СУБД) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:04 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
_мод, для Web это плохой вариант - потому что сессии с клиентом нет и понять, отвалился ли клиент или еще запросит следующую порцию данных (через сутки, к примеру) - невозможно. И даже если удастся понять - что, держать сутки открытый курсор? В этом случае повторное выполнение запроса становится меньшим злом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:24 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
_модЗапрос выполняется один раз, потом строки считываются из курсора (зависит от СУБД) Спасибо! Я уж было подумал, что это именно то, что мне нужно, пока Кот Матроскин не написал ответ на мой вопрос, который я еще не задал:)) Сохраняется ли курсор между закрытыми соединениями с SQL сервером? (т.е. клиент считал результаты, потом отключился, потом снова подключился(минут через 5) и снова запросил данные по открытому для него курсору). Если сохраняется - то логичный вопрос - как его закрыть, если клиент "ушел навсегда"? - логично заявление Кота Матроскина о том, что для веба курвсов - это плохая реализация(по понятной причине). Иначе говоря, разумным ли будет вариант написать резиндентную программу(локальную), которая будет отслеживать открытые курсоры и закрывать их?(например, курсоры, которые открыты более 20 минут назад). Я понимаю, что это извращение, но, если нет других вариантов, то почему бы и нет? - это, в любом случае, мнее требовательно к рессурсам чем повторные запросы с LIMIT'ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:39 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
Многие клиенты (манагеры) очень любят отгрузить эдак тыз 100 строк и гонять по ним свою аналитику и свои анализаторы или просто в Excel смотреть. Не стоит с ними бороться а лучше запилить кнопочку "save as excel" и решить этот вопрос навсегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:48 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, Вычитывать и хранить ID на первые 10 (обобщённо) страниц результата. Фактически для пользователя для "росмотра глазами" (для чего и организуется постраничный вывод) 51-я, 106-я и 107-я страницы результата идентичны (==вовсе не нужны). На представленных объёмах для ручного просмотра математическая точность результатов не нужна. Что делать, если пользователь таки запросил реузльтат, пролетевший мимо кэша - ублажать его и повторять выборку (которая должна пройти быстрей уже в силу кэширования на уровне СУБД) или представить случайную выборку из имеющегося в кэше - дело вкуса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:51 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
CawaSPbВычитывать и хранить ID на первые 10 (обобщённо) страниц результата. Фактически для пользователя для "росмотра глазами" (для чего и организуется постраничный вывод) 51-я, 106-я и 107-я страницы результата идентичны (==вовсе не нужны). Черт возьми! А это ведь и правда решение, до которого я, какого-то хрена, сам додуматься не мог! Сам же видел на сайтах кнопочку по типу "смотреть еще результаты" - эта кнопочка-то и отправляет повторный запрос SQL-серваку! И незачем кешировать все и сразу - можно закешировать только, скажем, первых 10 страниц(т.е. около 100 - 1000 результатов!). Это ОНО! Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:01 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
Кот Матроскиндля Web это плохой вариант - потому что сессии с клиентом нет В этом случае действительно только повторный запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:15 |
|
||
|
Хранение временных данных из SQL
|
|||
|---|---|---|---|
|
#18+
roman_lenko, BTW Ещё один вариант (который можно использовать как расширение схемы с кэшированием первых N страниц) - именно с открытыми курсорами. Иметь пул агентов, идентифицируемых пользовательским запросом. Исходно агент открывает курсор, читает, сколько надо, и коммитит транзакцию, оставляя курсор открытым (если СУБД это позволяет). Приходит запрос на "more results..", идентифицируем агента по запросу, тот читает дальше. Размер пула - в зависимости от имеющихся ресурсов. На самом деле это перекладывание вопросов хранения результатов на СУБД (что в общем случае правильно). На одних запросах результат требует предварительной материализации и под тем же курсором будет храниться во временной таблице, на других запросах будет храниться только план выполнения и "текущая позиция". Если получится организовать данные так, что запросы будут второго типа, то на больших системах имеет смысл заморачиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2013, 13:00 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38138039&tid=1541382]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 315ms |

| 0 / 0 |
