2017-05-09 32 views
0

我有一個Firebird數據庫,包含一個聯繫人列表,並且對於每個聯繫人,作爲服務和發票列表。c#DataAdapter.Fill性能改進

客戶表的數量級爲10k,發票/服務約爲聯繫人大小的5倍。問題是這些表格包含很多列(最多150列)。我知道這並不理想,但不幸的是,我無法重新設計數據庫,因爲它是按原樣強加的。

現在,我有時間的顯著部分(事實上,有近40%-50%),使用以下代碼花費在數據的純取:

DataTable dataTable = new DataTable(); 
dataTable.BeginLoadData(); 
FbDataAdapter fda = new FbDataAdapter(command); 
fda.Fill(dataTable); 
dataTable.EndLoadData(); 

我相當的事實,失望獲取30k行需要大約20秒的時間才能撥打唯一的Fill電話。有沒有希望改進這部分?任何替代(可能是商業)來改善這一點?

+1

你爲什麼要加載30,000行?你在做報告嗎? –

+0

你絕對需要一次加載所有內容嗎?如果不是,那麼最簡單的解決方案將是實現某種分頁(閱讀:一次加載一個較小的數字記錄,然後移動到下一個位)。 – stybl

+0

- 是的。我使用緩衝方法,因爲我需要對數據集進行靈活而沉重的搜索。基於內存的搜索是很多的,在這種情況下比服務器端快得多...... – neggenbe

回答

0

好吧,正如評論所說,除了考慮這裏的特例外,沒有什麼可以做的。我所做的是將大量的(不是行)分爲兩類:預覽列和完整(詳細)數據列。這個想法是一次加載預覽數據,並且只能根據請求加載一次一列。

現在只需要在下面的情況下,一看時間:

Overall: 5 runs, >16k rows, time includes all code in the question! 

Case 1: 4 preview fields (3 int, 1 float), 135(+4 preview) fields for full list 
Preview queries:   1063.3470 ms 
    Full queries:  25712.2665 ms 

Case 2: 12 preview fields (3 int, 9 float), 127(+12 preview) fields for full list 
Preview queries:   1457.1946 ms 
    Full queries:  25735.5247 ms 

Case 3: 13 preview fields (3 int, 9 float, 1 blob subtype 1), 126(+13 preview) fields for full list 
Preview queries:  4023.9923 ms 
    Full queries: 26777.5369 ms 


250 Queries with "WHERE" contstraint on a foreign key 
Returning 1052 row in total 
Total execution time 10348.0545 ms 

WOW!加載時間比FULL列表快6到20倍。當然,加載單個數據時我會有一個開銷......好吧,在測試之後,我用一個「where」條件查詢了一個外鍵。我運行的250個查詢中的每一個平均返回4行,平均執行時間爲42毫秒 - 時間用戶不得不等待每一次訪問給定行的細節(這是點擊,這樣在我的情況下絕對沒問題)。底線:分割數據也是這裏的關鍵,儘管我已經按列分割數據,而不是按行!

+0

這是一個非常整潔的方法!我沒有考慮以這種方式按列分割,儘管在我們的系統中,我不確定我們能夠滿足所有列的需求。這絕對是需要記住的事情,而且相當令人擔憂。我很想知道這個性能對MSSQL的影響是否相似。 – Alex