Russian Qt Forum

Qt => Базы данных => Тема начата: herbuz от Май 05, 2010, 21:07



Название: Работа с большой базой данных
Отправлено: 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"
Изначально QSqlQueryModel тянет небольшую часть, но когда начинаем скроллировать, то QSqlQueryModel по мере скрола подгружает данные! Но в конце концов все данные оказываются в оперативке! Поправьте, если кто-нить обошел данную штуку!?


Название: Re: Работа с большой базой данных
Отправлено: herbuz от Май 05, 2010, 23:27
Цитировать
QSqlQueryModel не считывал все данные, а подгружал их порциями
разве так само собой не происходит? Неужели QSqlQueryModel тянет все записи на клиента при обыкновенном "select"
Изначально QSqlQueryModel тянет небольшую часть, но когда начинаем скроллировать, то QSqlQueryModel по мере скрола подгружает данные! Но в конце концов все данные оказываются в оперативке! Поправьте, если кто-нить обошел данную штуку!?
Да,разве так и делает? просто мне этого и нужно было!!!у меня рои коннекте к базе все подвисает просто!с дампом работает на ура, а к реальной базе...вобщем мне так и нужно чтоб по мере скрола данные подгружались!костыли не очень хочется писать, ибо долго и дебажить еще потом придется достаточно(


Название: 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
...
void QSqlQueryModel::fetchMore(const QModelIndex &parent)
{
    Q_D(QSqlQueryModel);
    if (parent.isValid())
        return;
    d->prefetch(qMax(d->bottom.row(), 0) + QSQL_PREFETCH);
}

и потом, откуда Вы это узнали,что так и делает?
Попробуй простой пример! Таблица БД (~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?
QTableView! Изначально загрузиться и отобразиться в view небольшая часть данных из БД . Когда будешь тянуть вертикальный скрол и "дойдешь" до конца, то в этот момент подгрузятся еще данные (вызовится fetchMore). В этот момент, так как данных станет больше, число позиций для скрол бара увеличится. Я про этот лаг (ИМХО корявая реализация)!


Название: 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()) {
     myModel->fetchMore();
}
Тогда не будет проблем со скролом! Ну а если БД большая, то потребуется, видимо, свою модель делать!


Название: 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 бесполезно ???
Не понял?
ну может я перевел плохо и не понимаю...но вижу картину так, что если база не возвращает количество данных, то для того чтобы вытянуть все данные приходиться юзать fetchMore() так ведь?
Судя по всему придется самому все писать(раньше делал все сам, за это ругали. говорили мол есть все уже-велосипед изобретаешь, теперь переучился, всегда стараюсь найти встроенные штуки....наверное лучше искать грань между обоими подходами, получается так что уже боюсь сам что-то писать!


Название: Re: Работа с большой базой данных
Отправлено: alexman от Май 06, 2010, 19:45
Придется писать самому! ИМХО это в Qt должно появится в будущем!


Название: Re: Работа с большой базой данных
Отправлено: Пантер от Июнь 24, 2010, 11:44
1. БД не указана. Допустим, огнептиц позволяет фечить, а в постгресе сразу все подгружается.
2.
читал!получается что использование fetchMore бесполезно ???
Этот цикл как раз для тех, кому сразу все надо. топикстартеру это использовать не нужно.
3. Так как у ТС тянет сразу все данные, то вариант тут писать свою модель, в которой при выкачивании данных использовать лимиты в sql запросе.
4. И никто не запрещает покопаться в соответствующем плагине, исправить и написать письмо в суппорт.