2012-03-17 15 views
2

打開TClientDataset並獲取包含3個TBlobfields的10.000行需要3分鐘ClientDataset性能TBlobfields

開幕完全相同相同的數據,但鑄造BLOB字段爲varchar,需要1秒

唯一的區別是,TQuery(或TsqlQuery)具有TStringfields而不是TBlobfields。但數據是一樣的。整個表格保存到文件大約3 MB。 我使用TsqlQuery或TQuery連接到(firebird)數據庫時得到了相同的結果。

數據庫位於運行Firebird 2.1的服務器上。當在客戶端上運行數據庫(兩者均爲< 1秒)時,差異消失了,所以它必須是網絡流量的東西,我想...

它變得更奇怪: 不管客戶端數據集實際上是填充了BLOB字段。 所以,如果ClientDataSet的只有1持久字段(數字整數),性能是一樣的...

這個bug(?)對我來說是一個很大的問題。我希望有人能解釋這個.. 。

回答

2

退房這個職位上的Firebird FAQ website

簡而言之,它說:

  1. 如果查詢與BLOB的表,而不用實際讀取BLOB數據(只是在做SELECT *),這是一個好主意從列列表中刪除它們,因爲BLOB需要兩次到服務器(一次檢索BLOB ID,另一次檢索數據)。或者,你可以投BLOB爲varchar得到一些數據速度快:

選擇...,投(my_blob_field爲varchar(2000))

希望這有助於。

+0

謝謝。也許這就是問題所在,但是從1秒到3分鐘的表現會下降1次?這可能嗎? – 2012-03-17 20:44:27

+0

我相信除此之外還有更多。當我讀到你的帖子時,我的第一個問題是「你爲什麼要一次檢索3000個斑點」?由於blob可以有各種大小和數據,除非你施放,否則你永遠不知道自己得到了什麼。你究竟在blob字段中存儲了什麼? – 2012-03-17 22:52:13

+0

對不起,意思是10,000個blob .. – 2012-03-17 23:44:32

0

所以相互作用大致爲:

  • 將查詢發送到服務器&準備吧
  • 請求數據(你會看到一個搜索結果的「塊」回)。
  • 隨着塊被耗盡,FB客戶端要求獲取更多數據 因此這些返回爲「儘可能多的行以適合塊」類型的場景。

當您包含一個Blob時,通常BlobID將返回到一個塊中,然後當您實際要求您的應用程序訪問數據時,它會關閉並從該行對該Blob執行另一個特定請求。這是一個同步往返=延遲。至少10K記錄= 10K次往返。 HIH JAC