• 0
masmat

Как увеличить скорость отработки запроса SQL к базе SQLLite

Вопросы

Есть база SQLLite, 202 записи, 27 полей (столбцов). Объем 1,9 мб

Разработка в Delphi 10 Seatle Проекты для Android  и iOS отдельные, лишних модулей (разных платформ) нет.

SDK последних версий.

 

Есть запрос

select distinct Cat1 from client where Tip="s"  Order By Cat1

Результат запроса 12 записей, которые потом заполняются в ListView

      LV.BeginUpdate;
      LV.Items.Clear;

        while not Query.Eof do
          begin
              LItem := LV.Items.Add;
              LItem.Text := Query.FieldByName('Cat1').AsString;
              Query.Next;
           end;
      LV.EndUpdate;

Вопрос:

В первый раз запрос и заполнение ListView отрабатывается в течении 4-5 секунд. В следующий раз все отрабатывает за 1 секунду.

и так с каждым запросом.

 

Почему так происходит? Может кто-нить решал уже такую проблему?

Данное поведение наблюдается и на Android, и на iOS.

 

 

 

 

 

 

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


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

22 ответа на этот вопрос

  • 0
 запрос и заполнение ListView

 

 

почему-то мне кажется, что заполнение ListView происходит мгновенно

уточните, что съедает время - открытие датасета или все-таки подключение к БД?

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


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

 

 запрос и заполнение ListView

 

 

почему-то мне кажется, что заполнение ListView происходит мгновенно

уточните, что съедает время - открытие датасета или все-таки подключение к БД?

 

Подключение к БД происходит один раз, при первом обращении к ней. Так, что постоянного запроса на подключение нет.

 

Скорее всего это открытие датасета.

А есть ли вообще в мобильной платформе какое-нить ограничение скорости по чтению жесткой памяти?

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


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

Стоит спросить и про индексы. Имеются ли они, используете ли вы их? И если они есть, какого типа индексы?

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


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

Стоит спросить и про индексы. Имеются ли они, используете ли вы их? И если они есть, какого типа индексы?

 

Нет, индексы не использую.

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


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

 

Стоит спросить и про индексы. Имеются ли они, используете ли вы их? И если они есть, какого типа индексы?

 

Нет, индексы не использую.

 

Ну а почему? Может как раз в этом и разгадка? Попробуйте! И лично использую индекс типа NOCASE ASC. Не знаю как у вас, но у меня базу, более чем в 30 тыс строк, запрос ускорился с 7 секунд до 0,1 

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


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

Хотя меня смущает ваш вопрос, всего 202 записи, это очень мало, что бы так медленно открывалось(

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


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

Хотя меня смущает ваш вопрос, всего 202 записи, это очень мало, что бы так медленно открывалось(

 

Вот в том то и дело, с таким кол-вом записей индексы не спасут.

Тем более, что запрос идет по одному полю, а не по всей БД.

 

У меня есть сомнения на счет скорости обращения к файлу БД, т.к. он лежит на жестком диске. При выполнении запроса процессор можно сказать вообще не используется

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


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

Ну попробуйте все таки их поставить! Отпишитесь.

 

PS а лично использую для подключения компоненты от devart поэтому по вашему коннекту не подскажу. Попробуйте скачать пробную версию devart и сравнить.

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


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

И еще у вас там используется сортировка "Order By Cat1" поэтому индексы там еще как используются!

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


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

Ну попробуйте все таки их поставить! Отпишитесь.

 

PS а лично использую для подключения компоненты от devart поэтому по вашему коннекту не подскажу. Попробуйте скачать пробную версию devart и сравнить.

 

Дык вот как-то не хочется использовать сторонние компоненты, потом трудно "переезжать" на новые версии Delphi.

Один проект VLC так и остался на Delphi 2010 из-за этого, что очень печально.

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


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

И еще у вас там используется сортировка "Order By Cat1" поэтому индексы там еще как используются!

 

Сейчас еще одну штуку попробую, потом индексы поюзаю

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


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

 

Ну попробуйте все таки их поставить! Отпишитесь.

 

PS а лично использую для подключения компоненты от devart поэтому по вашему коннекту не подскажу. Попробуйте скачать пробную версию devart и сравнить.

 

Дык вот как-то не хочется использовать сторонние компоненты, потом трудно "переезжать" на новые версии Delphi.

Один проект VLC так и остался на Delphi 2010 из-за этого, что очень печально.

 

Попробуйте поставить на поле cat1 индекс типа NOCASE ASC

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


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

отпишитесь о результате, просто стало интересно))

 

Вообщем вроде как добрался до сути. Поставил секундомер на все операции и как оказалось, я зря грешил на БД.

В итоге самым затратным по времени оказалось создание и отрисовка формы.

post-1420-0-88441300-1455307611.png

Как видно на картинке, с момента нажатия на кнопку (Начали) до факта создания формы (Создали форму) прошло ЦЕЛЫХ 5 секунд (иногда доходило до 8 секунд)

 

Все остальные операции, включая: замену файла БД из ресурса, выполнение запроса, заполнение и отрисовка ListView, установка видимости 4 Label (зависит от типа запроса) выполнились за 1 секунду.

 

В итоге, вопрос по тормозам БД снят. Возникает теперь вопрос в увеличении скорости создания формы.

 

Ну и конечно 2-е и более нажатия на кнопку отрабатывают менее чем за 1 секунду.

 

Состав формы:

  • 1 TabControl + 3 Закладки
  • 3 ListView
  • 5 Rectangle
  • 5 Label
  • 1 CheckBox

И вот на создание этого уходит 5-8 секунд. Бедаааааа

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


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

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

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


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

ну и еще где то Ярослав говорил что при создании можно прогрузить с начало все стили а потом уже форма быстрее будет грузится. 

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


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

Попробуйте, как уже писали выше, использовать формы/фреймы. И ещё, как вариант, не создавать сразу все визуальные компоненты на вкладках, т.е. делать это только когда необходимо.

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


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

у меня фреймы отдельные создаются при переходе на конкретную вкладку

на mainstream 1.3 GHz смарте под андроид времени на создание форм уходит совершенно незначительное кол-во

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


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

Всем спасибо за советы.

Вообщем результаты.

 

Оставил на форме:

  • 1 TListView
  • 2 TRectangle
  • 1 TCheckBox
  • 1 TLabel

+ Почистил раздел USES от ненужных вещей

 

Скорость создания формы, заполнения LiistView  и открытие сократилось до 1 сек.

 

Т.О. получается, что нужно очень сильно минимизировать кол-во контролов на формах.

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


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

ну не сильно минимизировать, а разумно оптимизировать!

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


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

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

 

Вроде в RX есть изменения в этом. В одном проекте с табами положение элементов рассчитывал при создании формы. И при переходе на RX все это "развалилось". Пришлось на скорую руку переделывать. Как раз решил, что для оптимизации алгоритм изменили. Но подробно не разбирался.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти