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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableView и БД с большой таблицей  (Прочитано 17711 раз)
xilinx
Гость
« : Январь 06, 2007, 21:57 »

Версия QT 4.2.2, MySQL 5.027

при отображение таблицы в QTableView таблица выгребается полностью из БД. Подскажите, плиз, как сделать, чтобы вся таблица не выгребалась из БД, а только по мере необходимости, то есть запрашивались с БД только строки которые нужно отображать в данный момент и при пролистывании таблицы соответственно запрашивались данные.
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #1 : Январь 06, 2007, 22:03 »

Да, если кто знает мне тоже интересно...
Такого пока не делал...
но зная Qt, предполагаю, что это как то красиво и гладко либо уже сделано, либо делается....
Записан
bigirbis
Гость
« Ответ #2 : Январь 08, 2007, 10:14 »

Народ! Присоединяюсь. Тоже такая задача встала. Весьма большая таблица, а ресурсы предполагаемой системы очень ограничены.
Если кто делал или просто имеет соображения...
Записан
Ggg_old
Гость
« Ответ #3 : Январь 08, 2007, 12:17 »

1. А зачем большую таблицу тянуть в грид вообще? Может лучше отдавать маленькую? Человек не машина - большой грид не осилит..
2. Если большой резалтсет получился сложной выборкой, то пока вы не заберете это все на клиента, строки, попавшие в выборку, будут на shared блокировке и могут помешать активным пишущим транзакциям (если сервер-блокировочник) или просто тупо держать размещенные под выбрку ресурсы на сервере..
Записан
bigirbis
Гость
« Ответ #4 : Январь 08, 2007, 12:37 »

А если в качестве БД используется SQLite? А простой резалтсет может составлять до 50 метров? А объем оперативы 64 метра? И уж свопиться лишний раз ну никак нельзя?
Цель вопроса - можно ли реализовать виртуальный резалтсет (простой селект с таблицы) так, чтобы он подгружался по мере необходимости либо сверху, либо снизу, и занимал фиксированный не очень большой объем памяти?
Записан
Tonal
Гость
« Ответ #5 : Январь 08, 2007, 14:37 »

Используй LIMIT и OFFSET в селекте.
Записан
Alexandr Az
Гость
« Ответ #6 : Январь 09, 2007, 10:40 »

Да не тянет она всю таблицу, не тянет.
Тянет вот стоки
#define QSQL_PREFETCH 255
Цитировать

Цель вопроса - можно ли реализовать виртуальный резалтсет (простой селект с таблицы) так, чтобы он подгружался по мере необходимости либо сверху, либо снизу, и занимал фиксированный не очень большой объем памяти?

Можно, чегож нельзя. Можно чтобы подгружал токи по одной записи, по мере продвижения по таблице. Но вот как реализовать окно - не знаю. Сверху ну никак догрузка не получится.... Как минимум нуно чтобы двунаправленые курсоры были у БД, либо организовывать своё кеширование, что глупо и сложно (имеется в виду кеширование со сбрасыванием на винт). А проще всего реализовывать свой буфер, т.к. кеширует записи QSqlQuery (читай QSqlResult, который реализован в кутешных дровах). Выход следующий - реализация своей модели со своим буфером, который юзает QSqlQuery с установленым setForwardOnly. Понятно, чем ниже по таблице лезем, тем больше у нас памяти захватывается.
Записан
Jkc
Гость
« Ответ #7 : Январь 09, 2007, 11:17 »

Самый простой путь как мне кажется это использовать в селекте лимит + в QDataTable сделать не прокрутку а перелистывание записей, скажем по 40. Принцип как на страницах в интренет. только там ещё используют цифры  1,2,3,4,5 >> . В данном случае цифры думаю лишнее, достаточно << >> и плюс едит в котором можно было бы задавать начальный номер записи и выводить туда последний номер записи.
Записан
Alexandr Az
Гость
« Ответ #8 : Январь 09, 2007, 11:45 »

Прикольно, представляю, лазим по каталогам  и жмём на такие кнопочки........ Модель сама по себе запрашивает метод canFetchMore() при достижении конца таблицы, зачем тогда стрелочки. Единственное что - так это модель действительно расчитана на кеширование записей и продвижение только вперёд. Это раз. 2 - не все БД поддерживают такие фитчи. На мускуле можно сделать  - на firebird - нет
Записан
Jkc
Гость
« Ответ #9 : Январь 09, 2007, 12:37 »

Цитата: "Alexandr Az"
Прикольно, представляю, лазим по каталогам  и жмём на такие кнопочки........ Модель сама по себе запрашивает метод canFetchMore() при достижении конца таблицы, зачем тогда стрелочки. Единственное что - так это модель действительно расчитана на кеширование записей и продвижение только вперёд. Это раз. 2 - не все БД поддерживают такие фитчи. На мускуле можно сделать  - на firebird - нет


Ну во первых разница будет лиш в том что тут ты листаешь страницы как PageUp PageDown а не прокруткой в верх в низ.

Потом можно как листать записи скажем по 50 так и выбирать например от 2500той . Каждое перелистывание  или выборка это отдельный запрос где изменяем значения для LIMIT

В firebird по идее будет так  
Код:

SELECT FIRST 10 SKIP 20 column1, column2, column3 FROM foo

http://scott.yang.id.au/2004/01/limit-in-select-statements-in-firebird/
Конечно это не идеальный способ но по моему самый простой.
Записан
nova
Гость
« Ответ #10 : Январь 14, 2007, 13:00 »

Я вот одного не понимаю, зачем такое может понадобится пользователю( Вашей программы)?
Неужели вы полагаете что пользователь захочет, да и врядли физически сможет, просматривать такой объем информации?
Я не представляю себе задачи гдеб такое понадобилось.
В 99.99% случаев пользователь прекрасно знает что ему нужно в данный момент, и это "что" в 98% составдяет ОДНУ запись, в 2% случаев 10-100 записей, если у Вас получается больше то надо ставить вопрос не о том как кешировать/не кешировать зариси на клиентской машине, а о том что Вы не знаете о работе пользователя Улыбающийся и какие функции поиска необходимы для него.
В оставшихся 0,01% случаев может производится выборка большего колличества строк но не для показа пользователю, а для (например) печати длинной простыни отчета, которую ни кто не будет читать, и слаживания этого отчета в архив. А для ентого идеально подходит QSqlQuery.

P.S. Хотя по нынешним временам 50 Мб таблицы енто ОЧЕНЬ маленькая таблица. Можно и на клиентскую маину в память загружать. В особо извращенных случаях Улыбающийся
Записан
bigirbis
Гость
« Ответ #11 : Январь 14, 2007, 21:38 »

Цитировать
P.S. Хотя по нынешним временам 50 Мб таблицы енто ОЧЕНЬ маленькая таблица. Можно и на клиентскую маину в память загружать. В особо извращенных случаях

Имеется ввиду embedded...
Кстати, иногда и о старых машинах приходится задумываться (в редких случаях)
Цитировать
Я вот одного не понимаю, зачем такое может понадобится пользователю( Вашей программы)?
Неужели вы полагаете что пользователь захочет, да и врядли физически сможет, просматривать такой объем информации?

Имелась в виду динамическая фильтрация...
Но уже задумался о введении дополнительных ограничений на выборку.
Просто заказчик хотел бы видеть это именно так...
Записан
Вячеслав
Гость
« Ответ #12 : Январь 14, 2007, 22:59 »

Можно 5 копеек добавить ?
Динамическая фильтрация на embeded - это можно понять .... и даже сделать нормально... Но тащить 50 метров с сервера и фильтровать - как-то не кузяво - не проще в where засунуть фильтр ?
Записан
bigirbis
Гость
« Ответ #13 : Январь 15, 2007, 00:04 »

Цитировать
Но тащить 50 метров с сервера

Там SQLite будет локально...
Записан
Вячеслав
Гость
« Ответ #14 : Январь 15, 2007, 00:07 »

Гы ... а почему(SQLite) ? Подмигивающий Нужна быстрая или нормальная бд ? Если второе - яб на птица посмотрел ... встроенного - глюки(фичи) есть, но не критичные Подмигивающий)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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