2011-04-26 116 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