В общем, потестил малость, набросал приложение, сканирующее System32.
Дано:
3181 файл (+1 новый для проверки)
база с двумя одинаковыми таблицами (по два столбца(id, FileName) в каждой)
Результаты:
Проверка в цикле, каждый раз по запросу "SELECT * FROM tblFileName WHERE FileName = Имя файла", очень накладно получается примерно 4.8 сек. (4758мс)
Проверка с созданием и заполнением временной таблицы и запросом типа такого "select * from `temp` where FileName not in (select FileName from `tblFileName`)", достаточно быстро - 0.4 сек (437мс)
Ваш способ - примерно 2.2 сек. (2168мс)
Важно заметить, что во втором случае, время замерялось на две задачи, заполнение временной таблицы и сравнение, посредством одного запроса в бд. В первом же случае, данные сразу сравнивались, т.е. замерялся цикл запросов(3181 шт.) на выборку.
Выбор очевиден Не знаю, что мне взбрело в голову в предыдущем сообщении...)))
По поводу Limit, это ключевое слово позволяет не только ограничивать количество выбираемых данных, но и делать выборку блоками, например по 500 записей за раз (select FileName from `tblFileName` LIMIT 1,500), подошло бы, если бы нужно было извлекать блоками по 500 записей.
вот такой запрос:
FDQuery2.SQL.Clear;
FDQuery2.SQL.Add('SELECT * FROM tblFileName');
FDQuery2.Active := True;
FDQuery2.Open;
if not FDQuery2.IsEmpty then
begin
FDQuery2.Last;
mLogs.Lines.Add('Всего записей: ' + FDQuery2.RecordCount.ToString);
mLogs.Lines.Add('ID последней записи: ' + FDQuery2.FieldByName('ID').AsString);
end;
FDQuery2.Close;
Работает без проблем, извлекает сразу все записи.
p.s. Тесты проходили на Windows 7 Pro.