Russian Qt Forum
Май 23, 2024, 01:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Технология работы с большими таблицами баз данных  (Прочитано 8711 раз)
i9
Гость
« : Март 05, 2006, 23:16 »

Qt3. Postgres.
Задача: отображать большую таблицу (количество не важно, оптимизацией не будем тут заниматься, важно, что select выполняется порядка нескольких секунд). И так, нужно редактировать записи, удалять, добавлять, сортировать.
Вроде стандартный набор.
Заделал я через курсор и QDataTable это. Оказалось, что при рефреше таблице на клиента стягивается вся таблица, что есть громозко, но 1 раз при инициализации, и при сортировках это стерпеть можно, но как можно было эту задержку обойти при изменении таблицы? Наверняка кто-то как-то с подобной задачей сталкивался...

Заранее спасибо.
Записан
Hordi
Гость
« Ответ #1 : Март 06, 2006, 14:47 »

Функция refresh у QDataTable виртуальная. Переопредели ее и в ней принимай решение о refresh данных или иного. Больше вариантов при работе с QDataTable как то и в голову не приходит...
Записан
i9
Гость
« Ответ #2 : Март 06, 2006, 16:10 »

Цитата: "Hordi"
Функция refresh у QDataTable виртуальная. Переопредели ее и в ней принимай решение о refresh данных или иного. Больше вариантов при работе с QDataTable как то и в голову не приходит...

Переопределять ее, видимо, по-любому прийдется и пока видится 3 варианта: либо делать "select ... limit ...." для уменьшения выкачивания с сервера (но это замедляет скролинг), либо создать свой промежуточный буфер и при изменении таблицы синхронно менять и его (но это сложнее в реализации).
Ну и третий это вообще напрямую общаться с postgres и юзать курсор.
Вообще хотелось именно живой опыт узнать....
Записан
nEoN
Гость
« Ответ #3 : Март 06, 2006, 20:17 »

Цитата: "i9"
Qt3. Postgres.
Задача: отображать большую таблицу (количество не важно, оптимизацией не будем тут заниматься, важно, что select выполняется порядка нескольких секунд). И так, нужно редактировать записи, удалять, добавлять, сортировать.
...
Наверняка кто-то как-то с подобной задачей сталкивался...

Обычно большие таблицы нет нужды возвращать, т.к. пользователь не может визуально обрабатывать сотни/тысячи строк. При больших объёмах пользователю в любом случае понадобятся фильтры, которые как раз позволят минимизировать число строк выборки.
Может стОит добавить уточняющие поля, например отображать данные за период "с" "по".
Записан
i9
Гость
« Ответ #4 : Март 06, 2006, 21:33 »

Цитата: "nEoN"
Обычно большие таблицы нет нужды возвращать, т.к. пользователь не может визуально обрабатывать сотни/тысячи строк. При больших объёмах пользователю в любом случае понадобятся фильтры, которые как раз позволят минимизировать число строк выборки.

Это опытные пользователи могут эффективно использовать фильтры, а обычные захотят все и сразу...
Цитата: "nEoN"
Может стОит добавить уточняющие поля, например отображать данные за период "с" "по".

Этот метод однозначно улучшит ситуацию и его использовать буду, но как дополнительный, т.к. хотелось бы сделать работу нормальной и при большом числе записей.
Записан
BaltikS
Гость
« Ответ #5 : Март 07, 2006, 10:16 »

Честно говоря вопрос немного странный... Что значит много? 1млн записей? Это действительно много и не думаю, что пользователю это будет понятно и наглядно. По крайней мере если б у меня была таблица из хотя бы 10000 записей, я бы просто запарился искать нужную мне запись... Ну коли такая нетривиальная задача встала, то проще все измения таблицы кэшировать, а при её закрытии данные обновлять и тут без нового класса ну никак не обойтись!!!
Записан
Hordi
Гость
« Ответ #6 : Март 07, 2006, 10:49 »

Если я не ошибаюсь, то QDataTable использует курсор, т.е. на каждую ВИДИМУЮ на экране запись делается ОДИН запрос к базе. Лень исходники смотреть...

Я когда-то от QDataTable (QTable) отказался по другой причине - нужно было изменить высоту строки, а это требовало ручного изменения высоты КАЖДОЙ строки...
Записан
i9
Гость
« Ответ #7 : Март 07, 2006, 11:49 »

Цитата: "BaltikS"
Ну коли такая нетривиальная задача встала, то проще все измения таблицы кэшировать, а при её закрытии данные обновлять и тут без нового класса ну никак не обойтись!!!

Честно говоря, я пока склоняюсь к перегрузки QSqlCursor, чтоб он работал по принцыпу "select ... limit ...", т.к. в этом случае будет тормозить только скроллинг, зато данные будут более оперативно и надежно в базу кидаться...
А то, что класс прийдется переписывать/перегружать это нормально, без этого никуда...

добавлено спустя 9 минут:

 
Цитата: "Hordi"
Если я не ошибаюсь, то QDataTable использует курсор, т.е. на каждую ВИДИМУЮ на экране запись делается ОДИН запрос к базе. Лень исходники смотреть...

Таблица при отрисовке ячейки запрашивает инфу у курсора, а тот ее выгрибает из базы при инициализации:
Код:

bool QSqlCursor::exec( const QString & sql ){
    d->lastAt = QSql::BeforeFirst;
    QSqlQuery::exec( sql );
    return isActive();
}


Мысля: может можно как-то при изменении данных давать базе "insert/updete/delete" и соответствующие изменения производить в курсоровом буфере... Погляжу в исходниках...
Записан
Hordi
Гость
« Ответ #8 : Март 07, 2006, 15:38 »

Курсор на то и курсор, что он имеет текущую позицию и от нее прыгает и получает данные. Инфу из базы при инициализации он не выгребает (в смысле не накапливает), иначе все было бы очень долго и ресурсов требовало бы много. А вот пробегать по базе (таблице) вполне может...
Записан
i9
Гость
« Ответ #9 : Март 07, 2006, 16:43 »

Цитата: "Hordi"
Курсор на то и курсор, что он имеет текущую позицию и от нее прыгает и получает данные. Инфу из базы при инициализации он не выгребает (в смысле не накапливает), иначе все было бы очень долго и ресурсов требовало бы много. А вот пробегать по базе (таблице) вполне может...

Я согласен с Вами, и если б так было все было бы хорошо, но на практике у меня получается, что чтоб отобразить пару десятков записей по сети прогоняется 13Мб. Это совсем не похоже на нормальную работу курсора, а затем скролирование по тысячам записей не грузит сеть вовсе...
Записан
Hordi
Гость
« Ответ #10 : Март 09, 2006, 17:31 »

Посмотрел исходники - QT данные не выгребает, это база данных. Т.е. полный рефреш все равно приведет к необходимости повторного выполнения запроса.
С какой базой работаешь? Может извратиться как-то получится...
Записан
i9
Гость
« Ответ #11 : Март 09, 2006, 19:32 »

Цитата: "Hordi"

С какой базой работаешь? Может извратиться как-то получится...

Работаю с Postgres, но стараюсь использовать стандартные вещи, чтоб как можно безболезненней можно было сменить базу.
PS не нравится мне стиль, когда приложение увязано наглухо с чем-то...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 19.