2012-01-11 57 views
2

我测试了一些数据库组件,如SDAC和别人,我发现了一些有趣的事情:AdoQuery如何处理斑点?

当我执行一个查询与TADOQuery和这个查询有很多BLOB字段的,我得到的所有行(fetchall)内存我的应用程序接近1.8GB,一切正常。

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

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

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

有没有人知道为什么ADO中的内存使用如此之好?

回答

1

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

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

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

+0

对不起,但那不能回答我的问题。我非常了解你的组件,特别是sdac,但我对TADOQuery如何在内部工作感兴趣。 – 2012-01-17 18:28:07