2

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

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

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

该数据库位于运行 Firebird 2.1 的服务器上。在客户端上运行数据库时(两者都<1秒),差异消失了,所以我想它一定是网络流量的东西......

它变得更加奇怪:客户端数据集实际上是否填充了 BLOB 字段并不重要。所以,如果客户端数据集只有 1 个持久字段(数字整数),性能是一样的......

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

4

2 回答 2

3

在Firebird 常见问题解答网站上查看此帖子

简而言之,它说:

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

选择 ...,演员(my_blob_field 作为 varchar(2000))

希望这可以帮助。

于 2012-03-17T20:37:57.893 回答
0

所以交互大致是:

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

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

于 2017-02-07T16:19:03.817 回答