ClientDataset表现TBlobfields

时间:2012-03-17 20:09:42

标签: performance delphi blob tclientdataset

打开TClientDataset,并获取包含3个TBlobfields的10.000行需要 3分钟

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

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

数据库位于服务器上,运行Firebird 2.1。在客户端上运行数据库(两者都<1秒)时,差异已经消失,因此我认为它必须是具有网络流量的东西......

更奇怪的是: Clientdataset实际上是否填充了BLOB字段并不重要。 因此,如果clientdataset只有1个持久字段(数字整数),则性能相同......

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

2 个答案:

答案 0 :(得分:3)

Firebird FAQ website

上查看此信息

简而言之,它说:

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

    希望这有帮助。

答案 1 :(得分:0)

所以这些互动大致是:

  • 将查询发送到服务器&amp;准备好了
  • 询问数据(你得到了&#34;块&#34;你的结果)。
  • 当块变得耗尽时,FB客户端要求更多数据 所以这些可以回到&#34;尽可能多的行可以放在一个块中#34;类型场景。

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