Быстрое чтение таблицы базы данных Nexus - PullRequest
5 голосов
/ 27 апреля 2011

Я хочу прочитать все содержимое таблицы в память как можно быстрее. Я использую базу данных Nexus, но я мог бы использовать некоторые методы, применимые ко всем типам баз данных в Delphi.

Таблица, на которую я смотрю, содержит 60 000 записей с 20 столбцами. Так что не большой набор данных.

Из моего профилирования я нашел следующее:

  • Доступ к таблицам напрямую с помощью TnxTable не быстрее и не медленнее, чем при использовании SQL-запроса и «SELECT * FROM TableName»

  • Простой цикл по строкам без фактического чтения или копирования данных занимает большую часть времени.

Производительность, которую я получаю -

  • Перебор всех записей занимает 3,5 секунды
  • Перебор всех записей, считывание значений и их сохранение занимает 3,7 секунды (т. Е. Всего 0,2 секунды)

Образец моего кода

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

    while not query.Eof do
        query.Next;

Это займет 3,5 секунды для таблицы строк с 60000.

Это представление звучит разумно? Существуют ли другие подходы, которые позволили бы мне читать данные быстрее?

В настоящее время я читаю данные с сервера на том же компьютере, но в конечном итоге это может быть другой сервер в локальной сети.

1 Ответ

7 голосов
/ 27 апреля 2011

Для оптимальной скорости чтения вы должны использовать режим 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;

Кроме того, если вам не нужно задавать диапазон для определенного индекса, обязательно используйте последовательный доступ.индекс для максимально быстрого доступа.

...