Быстрое чтение таблицы базы данных Nexus
Я хочу прочитать все содержимое таблицы в память как можно быстрее. Я использую базу данных 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 секунды на 60 000 строк таблицы.
Это звучит разумно? Существуют ли другие подходы, которые позволили бы мне читать данные быстрее?
В настоящее время я читаю данные с сервера на том же компьютере, но в конечном итоге это может быть с другого сервера в локальной сети.
1 ответ
Вы должны использовать режим BlockRead с таблицей Tnx для оптимальной скорости чтения:
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;
Кроме того, если вам не нужно задавать диапазон для определенного индекса, обязательно используйте индекс последовательного доступа для максимально быстрого доступа.