AdoQuery如何处理blob?

时间:2012-01-11 16:55:42

标签: delphi memory delphi-2010 ado

我正在测试一些数据库组件,例如SDAC和其他人,我发现了一些有趣的东西:

当我使用TADOQuery执行查询并且此查询包含大量blob字段并且我获得所有行(fetchall)时,我的应用程序的内存接近1.8GB并且一切正常。

使用其他组件,在同一个数据库上执行的相同查询会产生Out of Memory异常,因为它超过1.8GB的内存使用量。

我知道我不应该返回所有这些行,我应该使用分页和blablabla。但我很好奇ADO如何设法让所有行和其他组件都不能使用。

我认为ADO正在压缩内存中的blob,但这只是猜测。

有谁知道为什么ADO中的内存使用情况如此之好?

1 个答案:

答案 0 :(得分:1)

我不能说SDAC,但会说AnyDAC TADQuery:

  • 如果从FetchOptions Items中排除fiBlobs,则AnyDAC将不会立即获取BLOB值。但是会延迟提取,直到应用程序确实需要BLOB值;
  • 将FormatOptions。InlineDataSize设置为更小的值,将减少使用多个字符字段获取大型结果集时的内存使用量;
  • 指定FormatOptions。MapRules,应用程序可以选择更紧凑的数据类型表示。

此外,很少有其他技术可以在获取大型结果集时减少内存使用量。要正确使用它们,开发人员应该知道将返回什么类型的数据。某些选项使用的价格可能会略微降低获取性能。