2009-04-15 98 views
0

我有兩個應用程序(服務器和客戶端),它使用通過TDCOMConnection與TClientDataSet連接的TQuery, ,在某些情況下clientdataset打開大約300000條記錄,並且比應用程序拋出異常「臨時表資源限制」。臨時表資源限制

有沒有任何解決方法如何解決這個問題? (除了「不開如此龐大的數據集」?)

更新:哎呀,對不起,是300K記錄,而不是300萬..

回答

2

您有答案了。不要在ClientDataSet(CDS)中打開如此巨大的數據集。

三百萬行的CDS是一個巨大的內存負載(取決於每行的大小,也可以是巨大的)。

使用CDS的全部目的是快速處理可以在內存中操作的小數據集。增加許多行是荒謬的;改用真實的數據集,或重新設計一些東西,這樣你就不需要一次檢索多少行。

+0

錯誤 - 這是BDE的錯誤,所以它的TQuery和那裏有300K記錄。 – 2009-04-16 06:28:32

1

超過300萬條記錄太多,無法立即處理。我的猜測是,你正在執行一個導出或類似的東西,這需要發送很多記錄。一種可以用來減少這個問題的方法是讓中間層生成一個導出文件,然後將該文件傳遞給客戶端(最好先使用ZLIB或類似的東西壓縮)。

如果你拉的數據返回給客戶端觀看的目的,然後再考慮只發送彙總信息,然後允許客戶端在同一時間挖thier方式通過數據的部分。用戶會感謝你,因爲你的表現會有所提高,他們不需要挖掘他們不關心的記錄。

編輯

即使300,00條記錄是太多處理一次。如果你有這麼多便士,你會把它們全部帶走嗎?但是,如果你把它變成更大的教派,你可以。如果您將數據發送給客戶以獲得報告,那麼我強烈建議使用總結方法......給他們一個大的圖片,讓他們慢慢鑽入數據。發送分組數據,然後讓他們慢慢打開。

如果這是一個搜索結果屏,然後設置要返回的記錄數的限制+ 1。例如,顯示100條記錄,將限制設置爲101仍然只顯示100中,最後的記錄是指有超過100條記錄,所以客戶需要調整他們的搜索條件以返回更小的子集。

3

錯誤可能來自TQuery而不是TClientDataSet。當使用TQuery時,它會創建一個臨時表,並且可能會觸發這個限制。然而,在這麼說的時候,將300萬條記錄加載到TClientDataSet中也是一個壞主意,因爲它會嘗試將每條記錄加載到內存中 - 如果它們每個只有幾個字節,可能會有可能,但它可能仍會導致您的機器死機在1kb的每個你最少需要3GB的RAM)。

你應該嘗試將你的數據分成更小的塊。如果是TQuery失敗,這意味着調整SQL(更少的字段/更少的記錄)或移動到更好的數據庫(畢竟,BDE有點累)。

+0

是的,它是tquery,但是300K的記錄,不幸的是我不能從BDE移動(這是舊的和大的項目),我不能移動到「更好」的數據庫(這是甲骨文:)) – 2009-04-16 06:32:16

0

臨時表資源限制不是對單個查詢的限制。這是所有打開的查詢在一起的限制。因此它可能是您關閉所有其他查詢的解決方案。

如果您無法使用ADO連接,也可以設計一個逐頁查詢數據的分頁機制。

好運的TClientdataSet不