【问题标题】:ClientDataset performance TBlobfieldsClientDataset 性能 TBlobfields
【发布时间】:2017-02-08 00:19:03
【问题描述】:

打开一个 TClientDataset,并获取包含 3 个 TBlob 字段的 10.000 行需要 3 分钟

打开完全相同相同的数据,但将 BLOB 字段转换为 Varchar,需要 1 秒

唯一的区别是,TQuery(或 TsqlQuery)有 TStringfields,而不是 TBlobfields。但数据是一样的。保存到文件的整个表大约为 3 MB。 我使用 TsqlQuery 或 TQuery 连接到(火鸟)数据库得到了相同的结果。

数据库位于运行 Firebird 2.1 的服务器上。在客户端上运行数据库时差异消失了(两者都

它变得更加奇怪: Clientdataset 是否实际填充了 BLOB 字段并不重要。 所以,如果clientdataset只有1个持久化字段(数字整数),性能是一样的……

这个错误(?)对我来说是个大问题...希望有人能解释一下...

【问题讨论】:

    标签: performance delphi blob tclientdataset


    【解决方案1】:

    查看Firebird FAQ website上的这篇文章

    简而言之就是:

    1. 如果您使用 BLOB 查询表而不实际读取 BLOB 数据(仅执行 SELECT *),最好将它们从列列表中删除,因为 BLOB 需要两次访问服务器(一次检索 BLOB ID,另一次检索检索数据)。或者,您可以将 BLOB 转换为 varchar 以更快地获取一些数据:

    选择...,强制转换(my_blob_field as varchar(2000))

    希望这会有所帮助。

    【讨论】:

    • 谢谢。也许这就是问题所在,但是对于那 1 次额外的行程,性能从 1 秒下降到 3 分钟?有可能吗?
    • 我敢肯定还有更多。当我阅读你的帖子时,我的第一个问题是“你到底为什么要一次检索 3,000 个 blob”?由于 blob 可以是各种大小和数据,因此除非您进行投射,否则您永远不会真正知道自己得到了什么。您在 blob 字段中究竟存储了什么?
    • 用途是存储富文本。它不是为检索那么多数据而设计的,但我的一些客户最近导入了一些记录超过 10.000 条的外部文件,这导致程序冻结了 4 分钟。我只是想让它为他们工作,因为投射对我有用,我希望它也适用于网格中播种的富文本......
    【解决方案2】:

    所以交互大致是:

    • 将查询发送到服务器并进行准备
    • 请求数据(您会得到一个“块”结果)。
    • 当块耗尽时,FB 客户端请求更多数据 所以这些返回为“可以容纳在一个块中的尽可能多的行”类型的场景。

    当您包含 Blob 时,通常会在一个块中返回 BlobID,然后当您在应用程序中实际请求访问数据时,它会从该行对该 Blob 执行另一个特定请求。这是一个同步往返 = 延迟。 10K 条记录 = 至少 10K 次往返。 HIH 江淮汽车

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多