Как AdoQuery обрабатывает капли? - PullRequest
2 голосов
/ 11 января 2012

Я тестирую некоторые компоненты баз данных, такие как SDAC и другие, и обнаружил кое-что интересное:

Когда я выполняю запрос с TADOQuery, и у этого запроса есть много полей больших двоичных объектов, и я получаювсе строки (fetchall) память моего приложения приближается к 1,8 ГБ, и все работает нормально.

При использовании других компонентов тот же запрос, выполняемый в той же базе данных, создает исключение Out of Memory, поскольку оно превышает 1,8 ГБ памяти.

Я знаю, что не должен возвращать все эти строки, яследует использовать нумерацию страниц и блаблабла.Но мне любопытно, как ADO может управлять всеми строками и другими компонентами.

Я думаю, что ADO сжимает большие двоичные объекты в памяти, но это только предположение.

Кто-нибудь знает, почему использование памяти в ADO так хорошо?

1 Ответ

1 голос
/ 11 января 2012

Я не могу сказать о SDAC, но скажу о AnyDAC TADQuery:

  • , если исключить fiBlobs из FetchOptions. Items , тогда AnyDAC не будет извлекатьBLOB значения сразу.Но будет откладывать выборку до тех пор, пока приложению действительно не понадобится значение BLOB;
  • установит FormatOptions. InlineDataSize на более маленькое значение, уменьшит использование памяти при извлечении большого результирующего набора с несколькими символьными полями;
  • указание FormatOptions. MapRules , приложение может выбрать более компактное представление типа данных.

Также есть несколько других методов, позволяющих уменьшить использование памяти при извлечении большого результата.наборы.Чтобы правильно их использовать, разработчик должен знать, какие данные будут возвращены.Цена за использование некоторых опций может быть немного снижена.

...