Название: Работа с большой базой данных Отправлено: herbuz от Май 05, 2010, 21:07 Вообщем есть большая база данных мне нужно прочитать данные из таблицы быстро. т.е. так чтобы QSqlQueryModel не считывал все данные, а подгружал их порциями.слышал про QSqlQueryModel::fetchMore(), но кто-нить работал с этой функцией, нормально заюзать мне не удалось(работает не так как я понимаю)
Вобщем есть у кого какие соображения? Название: Re: Работа с большой базой данных Отправлено: alexman от Май 05, 2010, 22:14 Придется свои костыли изобретать :) Можно сделать свою модель, которая читает нужные число строк из БД!
Название: Re: Работа с большой базой данных Отправлено: break от Май 05, 2010, 22:19 Цитировать QSqlQueryModel не считывал все данные, а подгружал их порциями разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"Название: Re: Работа с большой базой данных Отправлено: alexman от Май 05, 2010, 22:27 Цитировать QSqlQueryModel не считывал все данные, а подгружал их порциями разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 05, 2010, 23:27 Цитировать QSqlQueryModel не считывал все данные, а подгружал их порциями разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 07:53 Да,разве так и делает? Так и делает!Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 09:38 хорошо, тогда как поменять объем данных, которые будут докачиваться?например, я хочу чтоб во время скроллинга докачивалось по 100 записей?это вообще можно поменять в QSqlModelQuery?или что вообще юзать нужно для этого, может что другое посоветуете?и потом, откуда Вы это узнали,что так и делает?
Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 10:11 хорошо, тогда как поменять объем данных, которые будут докачиваться?например, я хочу чтоб во время скроллинга докачивалось по 100 записей? Поменять нельзя! Это жестко в коде зашито! Да и зачем?Код: #define QSQL_PREFETCH 255 и потом, откуда Вы это узнали,что так и делает? Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает ;) Это все из-за подкачки!Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 11:05 Цитировать Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает ;) Это все из-за подкачки! Лагать будет QTableView или QSqlQueryModel?Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 12:22 Цитировать Попробуй простой пример! Таблица БД (~1000 записей), QSqlQueryModel для этой таблицы и QTableView. Потяни за скрол и увидешь как он лагает ;) Это все из-за подкачки! Лагать будет QTableView или QSqlQueryModel?Название: Re: Работа с большой базой данных Отправлено: crossly от Май 06, 2010, 14:12 согласен с последним оратором.... возможно нужно было получить количество строк таблицы и именно его использовать в качестве максимума для скролбара
Название: Re: Работа с большой базой данных Отправлено: BRE от Май 06, 2010, 14:17 согласен с последним оратором.... возможно нужно было получить количество строк таблицы и именно его использовать в качестве максимума для скролбара ::)int QSqlQueryModel::rowCount ( const QModelIndex & parent = QModelIndex() ) const [virtual] Reimplemented from QAbstractItemModel::rowCount(). If the database supports returning the size of a query (see QSqlDriver::hasFeature()), the amount of rows of the current query is returned. Otherwise, returns the amount of rows currently cached on the client. Название: Re: Работа с большой базой данных Отправлено: crossly от Май 06, 2010, 14:53 ага.... только работает не везде... :)
Название: Re: Работа с большой базой данных Отправлено: BRE от Май 06, 2010, 14:57 ага.... только работает не везде... :) Ну тут уж... If the database supports... :)Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 16:05 После setQuery можно вызвать
Код: while (myModel->canFetchMore()) { Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 16:06 Цитировать QTableView! Изначально загрузиться и отобразиться в view небольшая часть данных из БД . Когда будешь тянуть вертикальный скрол и "дойдешь" до конца, то в этот момент подгрузятся еще данные (вызовится fetchMore). В этот момент, так как данных станет больше, число позиций для скрол бара увеличится. Я про этот лаг (ИМХО корявая реализация)! С таблицей на 5000 записей QSqlQueryModel::fetchMore вызывается один раз!вроде как fetchMore не совсем подгружает данные, а инициирует возвращение данных из запроса принудительно(так я понял из асистента).Название: Re: Работа с большой базой данных Отправлено: crossly от Май 06, 2010, 16:11 угу... запрос запрашивает все данные fetchMore только добавляет их в модель...
Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 16:14 угу... запрос запрашивает все данные fetchMore только добавляет их в модель... Так зачем тогда в цикле его фигачить??? :oНазвание: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 16:45 угу... запрос запрашивает все данные fetchMore только добавляет их в модель... Так зачем тогда в цикле его фигачить??? :oИз Qt Assistant: void QSqlQueryModel::fetchMore ( const QModelIndex & parent = QModelIndex() ) [virtual] Reimplemented from QAbstractItemModel::fetchMore(). Fetches more rows from a database. This only affects databases that don't report back the size of a query (see QSqlDriver::hasFeature()). To force fetching of the entire database, you can use the following: while (myModel->canFetchMore()) myModel->fetchMore(); parent should always be an invalid QModelIndex. This function was introduced in Qt 4.1. See also canFetchMore(). Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 16:51 читал!получается что использование fetchMore бесполезно ???
Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 17:19 читал!получается что использование fetchMore бесполезно ??? Не понял?Название: Re: Работа с большой базой данных Отправлено: herbuz от Май 06, 2010, 17:32 читал!получается что использование fetchMore бесполезно ??? Не понял?Судя по всему придется самому все писать(раньше делал все сам, за это ругали. говорили мол есть все уже-велосипед изобретаешь, теперь переучился, всегда стараюсь найти встроенные штуки....наверное лучше искать грань между обоими подходами, получается так что уже боюсь сам что-то писать! Название: Re: Работа с большой базой данных Отправлено: alexman от Май 06, 2010, 19:45 Придется писать самому! ИМХО это в Qt должно появится в будущем!
Название: Re: Работа с большой базой данных Отправлено: Пантер от Июнь 24, 2010, 11:44 1. БД не указана. Допустим, огнептиц позволяет фечить, а в постгресе сразу все подгружается.
2. читал!получается что использование fetchMore бесполезно ??? Этот цикл как раз для тех, кому сразу все надо. топикстартеру это использовать не нужно.3. Так как у ТС тянет сразу все данные, то вариант тут писать свою модель, в которой при выкачивании данных использовать лимиты в sql запросе. 4. И никто не запрещает покопаться в соответствующем плагине, исправить и написать письмо в суппорт. |