0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 54
1

Медленная работа ADO

12.06.2024, 21:44. Показов 2183. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для доступа к базе данных использую компоненты TADOConnection и TADOTable. База данных примерно на 7000 записей на примерно 20 полей, сформирована в Access.

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

Именно на процедуре активации фильтра и заполнения ComboBox и происходит существенное подтормаживание, на секунд 40 программа подвисает. Причем чаще всего это происходит при запуске приложения, данная функция у меня включена в событии главной формы OnCreate. Периодичность подвисания в среднем 1 раз в 15 запусков приложения. Хотя иногда бывает через раз, а иногда и через 50 запусков.

Во время работы приложения тоже применяется такая функция (фильтрация и заполнение ComboBox), но зависания случаются заметно реже, по ощущениям раз в 5.

Можно ли как-то ускорить работу с базой данных через какие-то специфические настройки компонентов доступа к данным? Или каким-то другим способом. Недавно расширил эту базу данных на тысячу записей примерно и подвисания стали случаться чаще и это стало напрягать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2024, 21:44
Ответы с готовыми решениями:

Aser v5 i7 u - очень медленная загрузка системы и такая же медленная работа приложений
Всем привет. Полгода назад купил ноут ( aser v5 i7 u) . Все было нормально, но неделю назад...

Медленная работа с БД
Есть MS SQL-2008 на неплохом железе - ОЗУ 96 Гб. На нём есть база CRM Dynamics. Счёт записям идёт...

Медленная работа 1С
Народ работает в терминале Есть сервер, i5-4460, 32GB, hdd Пользователей много потому решили...

Медленная работа 1С
Доброго дня ... Стала жутко медленно работать 1С даже когда один на сервере . В новогодние...

7
31 / 19 / 6
Регистрация: 21.10.2022
Сообщений: 284
Записей в блоге: 1
12.06.2024, 23:06 2
Сделай вывод в лог времени после каждой операции и смотри где касяк.
0
Модератор
9378 / 6149 / 2401
Регистрация: 21.01.2014
Сообщений: 26,239
Записей в блоге: 3
13.06.2024, 05:25 3
Лучший ответ Сообщение было отмечено TrollHammer как решение

Решение

Цитата Сообщение от GenriF Посмотреть сообщение
и TADOTable.
Вот это - основная причина тормозов.
При использовании компонентов T...Table программа при первом обращении грузит в память ВЕСЬ набор данных, нужен он в текущий момент или не нужен - ей пофигу. Сами понимаете, что чем больше этот набор данных - тем больше времени занимает его загрузка в память. А тем паче, если этих наборов несколько.
Причем база данных может располагаться как на другом краю света, так и лежать рядом с ехе-файлом приложения - разницы абсолютно никакой, разве что при удаленном расположении базы накладываются ограничения, связанные с пропускной способностью канала связи...
Потом работа происходит нормально и быстро, но все это происходит с локальной копией НД в памяти. И рано или поздно наступает момент, когда компонент T...Table решает синхронизировать данные локального НД с данными в самой БД. А что происходит в этот момент? Правильно, все 100500 записей передаются обратно из памяти в БД, а потом, в случае многопользовательской базы, снова ВСЕ данные из БД тянутся на клиента. И происходит это с периодичностью... А вот пес его знает, с какой периодичностью, это, как и порядок сортировки, спрятано "под капотом" компонента и повлиять на этот процесс Вы не можете.
Цитата Сообщение от GenriF Посмотреть сообщение
расширил эту базу данных на тысячу записей примерно и подвисания стали случаться чаще
Поверьте, когда база вырастет на порядок - на порядок же вырастет и время ожидания. И, итогом, когда-нибудь наступит тот прекрасный момент, когда программа у Вас будет вылетать при старте с сообщением о нехватке памяти...
Цитата Сообщение от GenriF Посмотреть сообщение
База данных примерно на 7000 записей
Цитата Сообщение от GenriF Посмотреть сообщение
При фильтрации отбирается как правило не более 200 записей
Вот! О чем я и говорю. Зачем Вы тянете себе все свои 7000+ записей, если Вам, по факту, требуется всего 200?

Вторым моментом, тормозящим процесс, является графический интерфейс. Вот готов поспорить на что угодно, что большую часть пространства формы занимает компонент DBGrid (ну, или его сторонний аналог) в котором отображаются все 100500 записей, которые никто и никогда полностью не смотрит и смотреть никогда не будет. И на отображение этой, ненужной в данный момент, информации тоже тратится время, и чем больше данных - тем больше времени для отображения требуется. А так как форма имеет свойство перерисовываться при малейшем чихе - то сами понимаете...

Цитата Сообщение от GenriF Посмотреть сообщение
Можно ли как-то ускорить работу с базой данных
Можно.
1. Использовать нормальные инструменты для работы с БД - SQL-запросы. И, соответственно, компоненты TADOQuery
2. Пересмотреть интерфейс программы без отображения бесполезной информации.
3
TrollHammer
13.06.2024, 09:08
  #4

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
1. Использовать нормальные инструменты для работы с БД - SQL-запросы. И, соответственно, компоненты TADOQuery
2. Пересмотреть интерфейс программы без отображения бесполезной информации
Неоспоримая истина

0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 54
13.06.2024, 10:15  [ТС] 5
Цитата Сообщение от D1973 Посмотреть сообщение
Вот готов поспорить на что угодно, что большую часть пространства формы занимает компонент DBGrid (ну, или его сторонний аналог) в котором отображаются все 100500 записей, которые никто и никогда полностью не смотрит и смотреть никогда не будет.
Нет, такой таблицы нету. База данных используется только для выборки определенных записей, которые нужно отобразить в данный момент времени. Причем под "отобразить" - я подразумеваю всего лишь заполнение ComboBox данными одного из полей отфильтрованного набора. Ну и кроме того, функционал программы использует значение еще примерно 5-ти полей, которые пользователю вообще не выводятся. А около 15-ти полей не нужны вообще - ни для отображения, ни для внутренней работы программы. То есть БД обладает избыточным набором данных, который не нужен конкретно для этой программы (но нужен для других).

Надо попробовать через ADOQuery все сделать.
0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 54
14.06.2024, 16:25  [ТС] 6
Поменял Table на Query, притормаживания пропали. Спасибо!
0
Модератор
9378 / 6149 / 2401
Регистрация: 21.01.2014
Сообщений: 26,239
Записей в блоге: 3
14.06.2024, 17:40 7
Цитата Сообщение от GenriF Посмотреть сообщение
Поменял Table на Query
Тут вся фишка не только в замене одного компонента другим, но и в самом подходе: вместо того, чтобы тянуть всю таблицу на клиента, а потом быстро фильтровать, мы делаем запрос и получаем набор данных, который уже удовлетворяет нужным нам условиям и не требует никакой фильтрации. Надеюсь, Вы это так и сделали?
0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 54
14.06.2024, 18:41  [ТС] 8
Цитата Сообщение от D1973 Посмотреть сообщение
Тут вся фишка не только в замене одного компонента другим, но и в самом подходе: вместо того, чтобы тянуть всю таблицу на клиента, а потом быстро фильтровать, мы делаем запрос и получаем набор данных, который уже удовлетворяет нужным нам условиям и не требует никакой фильтрации. Надеюсь, Вы это так и сделали?
Да, по запросу всегда выбирается небольшое количество записей.

Вообще изначально применял Table, почитав Архангельского (см. вложение). У меня как раз локальная БД, всего один пользователь, это вообще приложение для моих собственных нужд по роду основной профессии. По сути просто некоторые справочные данные.
Миниатюры
Медленная работа ADO  
0
14.06.2024, 18:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2024, 18:41
Помогаю со студенческими работами здесь

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

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

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

Медленная работа компьютера
Проблемма такая! 1.Тормажение в играх 2.Медленая работа компьютера...

Медленная работа скриптов
Здравствуйте. Есть такая проблема: php скрипты выполняются с пятиминутной задержкой. В чем проблема...

Медленная работа regex
Всем привет. Делаю небольшую программку для парсинга логов больших размеров. Столкнулся с такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru