Название: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 05, 2006, 23:16 Qt3. Postgres.
Задача: отображать большую таблицу (количество не важно, оптимизацией не будем тут заниматься, важно, что select выполняется порядка нескольких секунд). И так, нужно редактировать записи, удалять, добавлять, сортировать. Вроде стандартный набор. Заделал я через курсор и QDataTable это. Оказалось, что при рефреше таблице на клиента стягивается вся таблица, что есть громозко, но 1 раз при инициализации, и при сортировках это стерпеть можно, но как можно было эту задержку обойти при изменении таблицы? Наверняка кто-то как-то с подобной задачей сталкивался... Заранее спасибо. Название: Технология работы с большими таблицами баз данных Отправлено: Hordi от Март 06, 2006, 14:47 Функция refresh у QDataTable виртуальная. Переопредели ее и в ней принимай решение о refresh данных или иного. Больше вариантов при работе с QDataTable как то и в голову не приходит...
Название: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 06, 2006, 16:10 Цитата: "Hordi" Функция refresh у QDataTable виртуальная. Переопредели ее и в ней принимай решение о refresh данных или иного. Больше вариантов при работе с QDataTable как то и в голову не приходит... Переопределять ее, видимо, по-любому прийдется и пока видится 3 варианта: либо делать "select ... limit ...." для уменьшения выкачивания с сервера (но это замедляет скролинг), либо создать свой промежуточный буфер и при изменении таблицы синхронно менять и его (но это сложнее в реализации). Ну и третий это вообще напрямую общаться с postgres и юзать курсор. Вообще хотелось именно живой опыт узнать.... Название: Re: Технология работы с большими таблицами баз данных Отправлено: nEoN от Март 06, 2006, 20:17 Цитата: "i9" Qt3. Postgres. Задача: отображать большую таблицу (количество не важно, оптимизацией не будем тут заниматься, важно, что select выполняется порядка нескольких секунд). И так, нужно редактировать записи, удалять, добавлять, сортировать. ... Наверняка кто-то как-то с подобной задачей сталкивался... Обычно большие таблицы нет нужды возвращать, т.к. пользователь не может визуально обрабатывать сотни/тысячи строк. При больших объёмах пользователю в любом случае понадобятся фильтры, которые как раз позволят минимизировать число строк выборки. Может стОит добавить уточняющие поля, например отображать данные за период "с" "по". Название: Re: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 06, 2006, 21:33 Цитата: "nEoN" Обычно большие таблицы нет нужды возвращать, т.к. пользователь не может визуально обрабатывать сотни/тысячи строк. При больших объёмах пользователю в любом случае понадобятся фильтры, которые как раз позволят минимизировать число строк выборки. Это опытные пользователи могут эффективно использовать фильтры, а обычные захотят все и сразу... Цитата: "nEoN" Может стОит добавить уточняющие поля, например отображать данные за период "с" "по". Этот метод однозначно улучшит ситуацию и его использовать буду, но как дополнительный, т.к. хотелось бы сделать работу нормальной и при большом числе записей. Название: Технология работы с большими таблицами баз данных Отправлено: BaltikS от Март 07, 2006, 10:16 Честно говоря вопрос немного странный... Что значит много? 1млн записей? Это действительно много и не думаю, что пользователю это будет понятно и наглядно. По крайней мере если б у меня была таблица из хотя бы 10000 записей, я бы просто запарился искать нужную мне запись... Ну коли такая нетривиальная задача встала, то проще все измения таблицы кэшировать, а при её закрытии данные обновлять и тут без нового класса ну никак не обойтись!!!
Название: Технология работы с большими таблицами баз данных Отправлено: Hordi от Март 07, 2006, 10:49 Если я не ошибаюсь, то QDataTable использует курсор, т.е. на каждую ВИДИМУЮ на экране запись делается ОДИН запрос к базе. Лень исходники смотреть...
Я когда-то от QDataTable (QTable) отказался по другой причине - нужно было изменить высоту строки, а это требовало ручного изменения высоты КАЖДОЙ строки... Название: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 07, 2006, 11:49 Цитата: "BaltikS" Ну коли такая нетривиальная задача встала, то проще все измения таблицы кэшировать, а при её закрытии данные обновлять и тут без нового класса ну никак не обойтись!!! Честно говоря, я пока склоняюсь к перегрузки QSqlCursor, чтоб он работал по принцыпу "select ... limit ...", т.к. в этом случае будет тормозить только скроллинг, зато данные будут более оперативно и надежно в базу кидаться... А то, что класс прийдется переписывать/перегружать это нормально, без этого никуда... добавлено спустя 9 минут: Цитата: "Hordi" Если я не ошибаюсь, то QDataTable использует курсор, т.е. на каждую ВИДИМУЮ на экране запись делается ОДИН запрос к базе. Лень исходники смотреть... Таблица при отрисовке ячейки запрашивает инфу у курсора, а тот ее выгрибает из базы при инициализации: Код:
Мысля: может можно как-то при изменении данных давать базе "insert/updete/delete" и соответствующие изменения производить в курсоровом буфере... Погляжу в исходниках... Название: Технология работы с большими таблицами баз данных Отправлено: Hordi от Март 07, 2006, 15:38 Курсор на то и курсор, что он имеет текущую позицию и от нее прыгает и получает данные. Инфу из базы при инициализации он не выгребает (в смысле не накапливает), иначе все было бы очень долго и ресурсов требовало бы много. А вот пробегать по базе (таблице) вполне может...
Название: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 07, 2006, 16:43 Цитата: "Hordi" Курсор на то и курсор, что он имеет текущую позицию и от нее прыгает и получает данные. Инфу из базы при инициализации он не выгребает (в смысле не накапливает), иначе все было бы очень долго и ресурсов требовало бы много. А вот пробегать по базе (таблице) вполне может... Я согласен с Вами, и если б так было все было бы хорошо, но на практике у меня получается, что чтоб отобразить пару десятков записей по сети прогоняется 13Мб. Это совсем не похоже на нормальную работу курсора, а затем скролирование по тысячам записей не грузит сеть вовсе... Название: Технология работы с большими таблицами баз данных Отправлено: Hordi от Март 09, 2006, 17:31 Посмотрел исходники - QT данные не выгребает, это база данных. Т.е. полный рефреш все равно приведет к необходимости повторного выполнения запроса.
С какой базой работаешь? Может извратиться как-то получится... Название: Технология работы с большими таблицами баз данных Отправлено: i9 от Март 09, 2006, 19:32 Цитата: "Hordi" С какой базой работаешь? Может извратиться как-то получится... Работаю с Postgres, но стараюсь использовать стандартные вещи, чтоб как можно безболезненней можно было сменить базу. PS не нравится мне стиль, когда приложение увязано наглухо с чем-то... |