Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
0xdeadc0de

Тормоза с TADTable и SQLite при переборе 100 000 записей

Вопрос

Наблюдаю жесточайшие тормоза при переборе SQLite-таблицы на 100 000 записей. 
 
Алгоритм перебора:
procedure TForm1.btn_ShowAllRecordsClick(Sender: TObject);
var
  FieldID, FieldName: TField;
  I: Integer;
  TableItem: TADTable;
begin
  TableItem := TADTable.Create(nil);
  try
    TableItem.Connection := ADConnection1;
    TableItem.Open('item');
    FieldID := TableItem.FieldByName('id');
    FieldName := TableItem.FieldByName('name');
    TableItem.First;
    I := 1;
    ListBox1.BeginUpdate;
    try
      TableItem.DisableControls;
      try
        while not TableItem.Eof do
        begin
          if I mod 250 = 0 then
            Caption := Format('%d of %d', [I, TableItem.RecordCount]);
          ListBox1.Items.Add(Format('id: %d; name: %s', [FieldId.AsInteger, FieldName.AsString]));
          TableItem.Next;
          Inc(I);
        end;
      finally
        TableItem.EnableControls;
      end;
    finally
      ListBox1.EndUpdate;
    end;
  finally
    TableItem.Free;
  end;
end;
Первые 7 000 записей перебираются мгновенно. После перебор резко замедляется и дальше выполняется еле-еле. 100 000 записей перебирает около 30 минут. В чем может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Добавление в листбокс ресурсоемкое дело. Попробуй закоментировать строку  

// ListBox1.Items.Add(Format('id: %d; name: %s', [FieldId.AsInteger, FieldName.AsString]));

и проверь скорость работы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация  

  • Похожий контент

    • От estra
      FDQuery1.SQL.Text := 'select !x from dual'; FDQuery1.Macros.Clear; with FDQuery1.Macros.Add do begin Name := 'X'; Value := 'DUMMY'; end; FDQuery1.Prepare; Как получить результат prepare (запрос вида 'select DUMMY from dual')?
    • От estra
      Привет всем форумчанам!
      Нужна Ваша помощь. Есть пакет в ORACLE с глобальными переменными, типа:
      CREATE OR REPLACE PACKAGE GLOBALS IS
        BranchId NUMBER;
      -- 
      END GLOBALS;
      Вопрос: как получить значение переменных из пакета?
       
    • От sulion
      Коллеги, добрый день!
      Вопрос на засыпку - помогите пожалуйста, чего мне не хватает для успешного запуска?
      Список dll файликов прикрепляю внизу письма, Oracle 12.2 клиент стоит, PL/SQL Developer 12 использую каждый день
       
      Симптомы:
      Из хорошего - FireDAC Explorer успешно видит все нужные мне БД - и таблицы, и пакеты и т.д.
       
      В Delphi XE7 приложение работало успешно. Delphi 10.2.3 подчёркивает два модуля. Если эти два модуля закомментарить, то - компилирует успешно, но не может подцепиться ни к одной БД Oracle
       
      Создал пустое приложение, в него положил TFDConnection, драйвер Oracle он не видит
       
      Что уже пробовал:
      Вчера поставил все dll. Сегодня поставил Delphi 10.3.1 Architect Trial (на месяц), в нём проблема воспроизводится. Ещё раз переустановил драйвер Oracle.
       
      Что ещё можно сделать?
       
       
      Обещанный список dll:
      oci.dll
      ocijdbc12.dll
      ocijdbc12.sym
      ociw32.dll
      ociw32.sym
      ojdbc8.jar
      oramysql12.dll
      oramysql12.sym
      orannzsbb12.dll
      orannzsbb12.sym
      oraocci12.dll
      oraocci12.sym
      oraocci12d.dll
      oraocci12d.sym
      oraociei12.dll
      oraociei12.sym
      oraons.dll
      orasql12.dll
      orasql12.sym
       
       
       

      23.7z Request.7z
       
    • От x11
      При попытке подключиться к базе данных SQLite на эмуляторе с Android  7 получаю исключение:
      Delphi Tokyo + UniDAC 7.
      Эмулятор какой-то неполноценный?
    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От striker
      Добрый день!
      Работаю с MySQL
      Подключаюсь через FireDac.
      FDQuery+FDConnecton+Bind+Grid
      Запрос выполняется моментально, но как только подключаю Grid - начинает висеть. Grid заполняется очень долго - секунд 12-15.
      Причем результат запроса - всего 230 строк, хоть и join присутствует.
      Куда копать? Может дело быть именно в FMX?
    • От notricky
      Суть вопроса в заголовке.
      Есть ли какие-то настройки у базы или FireDAC чтобы в английской системе (винда 7) русский текст отображался не вопросами, а русским текстом?
      Настройки у БД UTF-8.
    • От Clio
      Добрый день !
      В приложении я использую базу SQLite (полt, содержащие дату и время тип REAL) . В TFDQuery я описал это поле - тип Float и через LiveBindings подключил к TGrid (Date Column). 
      Но в гриде отображается только год, а не полное время. 
      Подскажите, пожалуйста, как необходимо настроить поле в Query и TGrid, чтобы дата и время отображалась правильно.
    • От Олег Киреев
      Здравствуйте ребята. Моё имя Олег. Я из Минска.
      Подскажите пожалуйста. У меня есть приложение для OS Android представляющее собой базу данных в котором задеплоин файл БД SQLite. Хотелось бы пойти дальше и изучить как обновлять этот файл базы на этом приложении из удалённого сервера простора INTERNET. Может у кого есть готовое решение или ссылка где это подробно описано?
      Благодарю.
      С Уважением. Олег.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...