Russian Qt Forum

Qt => Базы данных => Тема начата: maybe78 от Сентябрь 17, 2009, 12:32



Название: Работа с BLOB большого размера
Отправлено: maybe78 от Сентябрь 17, 2009, 12:32
Использую QSqlTableModel. В базе, в полях BLOB, хранится большое количество файлов по 5мб. Каждый раз при выполнении SELECT запросов эти файлы начинают заполнять оперативную память.
Мне страшно представить, как все это будет тянуться по сетке.

Интересует, возможно ли считывать первые несколько байт BLOB поля, для того чтобы просто определять его наличие в соответствующей ячейке, и при необходимости считывать его целиком?

Или остается просто архивировать поля при загрузке и выгрузке так, чтобы вместо 5 мегабайт они занимали по одному? Но база будет большой, и поэтому такой вариант решения не совсем подходит.

Выручайте, ребята!

база FireBird, если чо



Название: Re: Работа с BLOB большого размера
Отправлено: Alp от Сентябрь 17, 2009, 13:55
Может стоит добавить колонку идентификаторы и вычитывать его? Например первые N байт файла пихать в отдельное поле.


Название: Re: Работа с BLOB большого размера
Отправлено: CroCIV от Сентябрь 17, 2009, 14:17
на самом деле. Если есть возможность добавить в таблицу еще одно поле, то можно реализовать так:
1. Добавить битовое поле blob_is_empty.
2. Контролировать моменты вставки, удаления значений в поле BLOB, устанавливая blob_is_empty в 0/1
3. Тянуть запросы из базы без поля BLOB, но с полем blob_is_empty
4. По запросу пользователя для конкретной записи, в соответствии с blob_is_empty вытягивать или не вытягивать из базы значение поля BLOB


Название: Re: Работа с BLOB большого размера
Отправлено: CroCIV от Сентябрь 17, 2009, 14:33
можно конечно и как ты хочешь делать, считывать первые несколько байт поля BLOB. Но это тебе надо на эту тему обратиться к стандарту SQL или к документации SQL - Firebird  (лучше к последней), на предмет функции считывающей заданное число байт поля. В Transact-SQL можно написать так

SELECT SUBSTRING(blob_column, start, length) FROM ...

где start - смещение в байтах относительно начала
length - число запрашиваемых байт.

Можно ли так в Firebird обращаться, я не знаю, работать не доводилось


Название: Re: Работа с BLOB большого размера
Отправлено: maybe78 от Сентябрь 17, 2009, 19:30
CroCIV, спасибо!
Пока обедал сам дошел до решения. Создал в базе столбцы TINYINT в которых хранятся 0 и 1-цы, в зависимости от наличия в соседних колонках записей. И Селект делаю не по всем колонкам, а по всем кроме блоб. К блобам обращаюсь только в случае необходимости.