Производительность ClientDataset TBlobfields - PullRequest
2 голосов
/ 18 марта 2012

Открытие набора TClientDataset и выборка 10.000 строк, содержащих 3 поля TBlob, занимает 3 минуты .

Открытие точно тех же данных, но приведение полей BLOB как Varchar занимает 1 секунду !

Единственное отличие состоит в том, что TQuery (или TsqlQuery) имеет поля TString вместо полей TBlob. но данные такие же. Вся таблица, сохраненная в файл, составляет около 3 МБ. Я получаю те же результаты, используя TsqlQuery или TQuery для подключения к базе данных (firebird).

База данных находится на сервере, на котором работает Firebird 2.1. Разница исчезла при запуске базы данных на клиенте (обе <1 секунды), поэтому я думаю, что это должно быть что-то с сетевым трафиком ... </p>

Становится еще более странным: Неважно, заполнен ли клиентский набор данных BLOB-полями. Таким образом, если в наборе данных клиента есть только одно постоянное поле (целое число), производительность будет такой же ...

Эта ошибка (?) Для меня большая проблема ... Надеюсь, кто-нибудь сможет это объяснить ...

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

Ознакомьтесь с этим постом на сайте часто задаваемых вопросов Firebird

В двух словах говорится:

  1. Если вы запрашиваете таблицы с BLOB-объектами без фактического чтения данных BLOB (просто с помощью SELECT *), рекомендуется удалить их из списка столбцов, поскольку для BLOB-данных требуются две поездки на сервер (один для получения идентификатора BLOB, а другой - получить данные). Кроме того, вы можете привести BLOB к varchar, чтобы получить некоторые данные быстрее:

select ..., cast (my_blob_field as varchar (2000))

Надеюсь, это поможет.

0 голосов
/ 07 февраля 2017

Таким образом, взаимодействия примерно такие:

  • отправьте запрос на сервер и подготовьте его
  • запросите данные (вы получите «блок» ваших результатов обратно).
  • по мере исчерпания блока клиент FB запрашивает дополнительные данные, поэтому они возвращаются в виде сценария типа «столько строк, сколько может поместиться в блоке».Обычно BlobID возвращается в блоке, а затем, когда вы фактически запрашиваете в своем приложении доступ к данным, он выполняет другой конкретный запрос для этого BLOB-объекта из этой строки.Это синхронная передача туда и обратно = задержка.10K записей = 10K туда-обратно как минимум.HIH JAC
...