2011-04-26 101 views
5

我想盡可能快地將表的全部內容讀入內存。我正在使用Nexus數據庫,但可能會使用一些適用於Delphi中的所有數據庫類型的技術。快速讀取Nexus數據庫表

我在看的表格有20,000列的60,000條記錄。所以不是一個龐大的數據集。

從我的分析,我發現了以下至今:

  • 訪問直接使用TnxTable是沒有更快的表或比使用SQL查詢和更慢的「SELECT * FROM表名」

  • 大部分時間都是循環遍歷行,而不實際讀取或複製任何數據的簡單行爲。

我得到的性能

  • 通過所有記錄循環需要3.5秒
  • 通過所有的記錄循環,讀取值並將其存儲,需要3.7秒(即只0.2秒更多)

A的我的代碼示例

var query:TnxQuery; 
begin 
    query.SQL.Text:='SELECT * FROM TableName'; 
    query.Active:=True; 

    while not query.Eof do 
     query.Next; 

60,000行表格需要3.5秒。

這種表現聽起來是否合理?我能採取哪些其他方法來讓我更快地讀取數據?

我目前正在從同一臺計算機上的服務器讀取數據,但最終可能來自LAN上的另一臺服務器。

+0

單是3.5秒還是循環中有其他指令?因爲如果你正在閱讀數據,你可能會用FieldByName來做這件事,因爲它的速度不是很快而聞名 – zz1433 2011-04-27 00:18:13

+0

只需要3.5s – awmross 2011-04-27 01:15:11

回答

7

您應該使用BlockRead模式與TnxTable最佳讀取速度:

nxTable.BlockReadOptions := [gboBlobs, gboBookmarks]; 
//leave out gboBlobs if you want to access blobs only as needed 
//leave out gboBookmarks if no bookmark support is required 

nxTable.BlockReadSize := 1024*1024; //1MB 
// setting block read size performs an implicit First 
// while block read mode is active only calls to Next and First are allowed for navigation 
try 
    while not nxTable.Eof do begin 
    // do something.... 
    nxTable.Next; 
    end; 
finally 
    nxTable.BlockReadSize := 0; 
end; 

另外,如果你不需要設置一個specifc指數範圍,確保使用順序訪問索引以儘可能快地訪問。

+0

WOW。總時間現在從3.7秒減少到0.5秒。一點也不差。 – awmross 2011-04-27 05:47:28

+0

關於指標;該表將默認使用默認索引,在我的情況下是順序訪問索引。所以我認爲我不需要做任何事情來使它使用順序訪問索引。 – awmross 2011-04-27 05:49:08

+1

只要您將SAI標記爲默認值並且IndexName屬性爲空,那麼是的,將使用SAI。 – 2011-04-27 05:59:41