2012-01-11 2 views
2

Я тестирование некоторых баз данных компонентов, таких как SDAC и других, и я узнал кое-что интересное:Как AdoQuery обрабатывает капли?

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

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

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

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

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

ответ

1

Я не могу сказать о SDAC, но будет говорить о AnyDAC TADQuery:

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

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

+0

Извините, но это не отвечает на мой вопрос. Я много знаю о ваших компонентах, особенно в sdac, но меня интересует, как TADOQuery работает внутри. –

Смежные вопросы