2011-04-26 5 views
5

Quiero leer todo el contenido de una tabla en la memoria lo más rápido posible. Estoy utilizando la base de datos Nexus, pero podría haber algunas técnicas que podría utilizar que se aplican a todos los tipos de bases de datos en Delphi.Lectura rápida de la tabla de la base de datos de Nexus

La tabla que estoy viendo tiene 60,000 registros con 20 columnas. Entonces no es un gran conjunto de datos.

Desde mi perfilado, he encontrado lo siguiente hasta el momento:

  • acceso a las tablas directamente utilizando TnxTable no más rápido es o más lento que el uso de una consulta SQL y 'SELECT * FROM TableName'

  • El simple acto de recorrer las filas, sin leer ni copiar ningún dato, toma la mayor parte del tiempo.

El rendimiento que estoy recibiendo es

  • bucle a través de todos los registros de toma 3,5 segundos
  • bucle a través de todos los registros, la lectura de los valores y su almacenamiento, toma 3.7 segundos (es decir, sólo 0,2 segundos más)

Una muestra de mi código

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

    while not query.Eof do 
     query.Next; 

Esto demora 3.5 segundos en una tabla de filas de 60,000.

¿Este rendimiento suena razonable? ¿Hay otros enfoques que pueda tomar que me permitan leer los datos más rápido?

Actualmente estoy leyendo datos de un servidor en la misma computadora, pero eventualmente esto puede ser de otro servidor en una LAN.

+0

¿Toma eso solo 3.5 o tiene otras instrucciones en el circuito? Porque si estás leyendo datos probablemente lo estés haciendo con FieldByName, que es famoso por ser no tan rápido – zz1433

+0

Eso solo toma 3.5s – awmross

Respuesta

7

Debería utilizar el modo BlockRead con un TnxTable para una óptima velocidad de lectura:

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; 

Además, si no es necesario establecer un rango en un índice specifc, asegúrese de utilizar el índice de acceso secuencial para el acceso más rápido posible.

+0

WOW. El tiempo total ahora se reduce de 3.7 segundos a 0.5 segundos. No está mal. – awmross

+0

En cuanto a índices; la tabla usará el índice predeterminado de forma predeterminada, que en mi caso es el índice de acceso secuencial. Así que creo que no tengo que hacer nada para que use el índice de acceso secuencial. – awmross

+1

Mientras mantenga la EFS marcada como predeterminada y la propiedad IndexName vacía, entonces sí, se usará la EFS. –

Cuestiones relacionadas