Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193

Очень медленное обновление таблиц БД 5-7 секунд

22.11.2023, 13:10. Показов 975. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure ServiceSaveConfig;
begin
  //Запись в БД ширины колонок.
  with DM1.FDCommand1 do begin
    //CommandText.Clear;
    //CommandText.Add('UPDATE tool_column_name_width SET ColumnWidth = :pColumnWidth WHERE FieldName = :pFieldName');
    for var I := 0 to Config.ColumnWidth.Count-1 do begin
      ParamByName('pColumnWidth').AsInteger := StrToIntDef(Config.ColumnWidth.ValueFromIndex[I], 100);
      ParamByName('pFieldName').AsString := Config.ColumnWidth.Names[I];
      Execute;
    end;
  end;
 
 
  //Запист в БД последоваетельность показа колонок в DBGrid
  with DM1.FDCommand2 do begin
   // CommandText.Clear;
    //CommandText.Add('UPDATE tool_tip SET ListShowColumn = :pListShowColumn WHERE IdTip = :pIdTip');
    for var I := 0 to Config.ShowColumnItemIndex.Count-1 do begin
      ParamByName('pListShowColumn').AsString := Config.ShowColumnItemIndex[I];
      ParamByName('pIdTip').AsInteger := StrToIntDef(Config.IdTipByItemIndex[I], -1);
      Execute;
    end;
  end;
end;
Очень медленно обновляются таблицы примерно 5-7 секунд.
Количество всего затрагиваемых данных в БД, в 2ух цикла for 52+22=74 строки. Заносимые данные в первом число 0-200 второй строка не более 50 символов.

Вначале я делал через добавление запроса CommandText.Add, потом я его вынести непосредственно в FDCommand1 и FDCommand2, как меня тут учили. Ожидал решения проблемы и восторга от того что наконец то увижу и пойму реальные плюсы, а не только минусы которые очевидны от этого действа. Но нет плюсов не было.

Разница быть может и есть в 1 секунду, а может и нет, даже с таким безобразным кодом. :
Delphi
1
2
3
4
5
6
7
8
9
for var I := 0 to Config.ColumnWidth.Count-1 do begin
  with DM1.FDC1 do begin
    CommandText.Clear;
    CommandText.Add('UPDATE tool_column_name_width SET ColumnWidth = :pColumnWidth WHERE FieldName = :pFieldName');
     ParamByName('pColumnWidth').AsInteger := StrToIntDef(Config.ColumnWidth.ValueFromIndex[I], 100);
     ParamByName('pFieldName').AsString := Config.ColumnWidth.Names[I];
     Execute;
  end;
end;
Процедура вызывается тут. Работают эти 2а вариант абсолютно идентично. Наблюдаю часики с подписью SQL перед закрытием программы 5-7 секунд.

Delphi
1
2
3
4
5
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Сохраняем настройки
  ServiceSaveConfig;
end;
Чё как медленно работает?

Добавлено через 5 минут
Кстати проблема возможно не в коде. Когда я таскаю БД свой програмулины дома у меня ноутбук выполняет обнавление таблиц за 0,05 секунд (полный перезалив БД по ее дампу с удалением таблиц).
А когда на работу я притаскиваю БД, то она обновляется-пересоздается по запросу за 4-7 секунд, причем такое на 2ух компах. А компы на работе мощнее моего ноутбука будут.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2023, 13:10
Ответы с готовыми решениями:

Очень медленное копирование?
Здравствуйте,уважаемые форумчане.Я написал не сложный макрос,но при копировании такого количества строк ,он работает больше пяти минут на...

Очень медленное отображение bmp
В базе Postgresql хранятся черно-белые bmp-картинки (pf1bit) Размер картинок строго 2500*3500. Мучаюсь над проблемой где-то месяц....

Очень медленное выполнение .c_str() в minGW
Есть функция: sscanf(line.c_str(), "%d\t%d\t%hu.%hu.%hu\t%hu:%hu:%hu\t%lf", &tmpData.Pip, &tmpData.Tm, &tmpData.Year, &tmpData.Mont,...

10
 Аватар для Beltar
828 / 443 / 38
Регистрация: 05.05.2022
Сообщений: 3,054
22.11.2023, 15:30
1) При сохранении колонок, для чего в гриде есть метод, надо считаться, что могут появиться новые поля в БД, но в гриде из-за старого конфига не отобразятся. Я с этим задолбался. Но это отдельная тема. Да и в БД их хранить для многопользовательской базы, это на всех что-ли? Надо каждому юзеру отдельно.

2) Методы профилирования выполнения запросов есть?

3) Возможность БД выполнять запросы пакетно есть? Разница м/б на порядки. И несколько десятков запросов - это много.

4) Производительность всегда зависит от того, как там с кэшированием данных из БД в памяти. Если они уже в оперативке, то выполнение будет быстрее, если же надо шманать винт...
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
22.11.2023, 17:41  [ТС]
2) Нет.
3) Нет. Не знаю еще о таком.
4) Дома прога закрывается за 1 секунду. В 5-6 раз быстрее чем на работе. Возможно действительно такая разница из за HDD дома у меня SSD, а на работе железяка. Хотя...считать файл дамп БД в 25кб .... и такая разница.
Ладно это мелочи на данном этапе развития.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
22.11.2023, 17:58
а что за база-то?

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

уже написали выше, а что, один поменял, и у всех поменяется?

а точно ли один раз выполняется этот кусок?
а точно ли именно тут несколько секунд проводим?
0
 Аватар для Beltar
828 / 443 / 38
Регистрация: 05.05.2022
Сообщений: 3,054
22.11.2023, 22:08
MS SQL Server позволяет создать пачку запросов, просто перечислив их через ; Т. е.

Delphi
1
2
3
4
5
6
7
8
9
for var I := 0 to Config.ColumnWidth.Count-1 do begin
  with DM1.FDC1 do begin
    CommandText.Clear;
    CommandText.Add('UPDATE tool_column_name_width SET ColumnWidth = :pColumnWidth WHERE FieldName = :pFieldName');
     ParamByName('pColumnWidth').AsInteger := StrToIntDef(Config.ColumnWidth.ValueFromIndex[I], 100);
     ParamByName('pFieldName').AsString := Config.ColumnWidth.Names[I];
     Execute;
  end;
end;
Превращается в

Delphi
1
2
3
4
5
6
7
8
9
10
11
CommandText.Clear;
for var I := 0 to Config.ColumnWidth.Count-1 do
  begin
  with DM1.FDC1 do
    begin
    CommandText.Add('UPDATE tool_column_name_width SET ColumnWidth = :pColumnWidth WHERE FieldName = :pFieldName')+';';
     ParamByName('pColumnWidth').AsInteger := StrToIntDef(Config.ColumnWidth.ValueFromIndex[I], 100);
     ParamByName('pFieldName').AsString := Config.ColumnWidth.Names[I];
    end;
end;
Execute;
Ну для Query так пачку собрать можно, про CommandText не знаю.

Access такого не умеет. Для каждой СУБД надо смотреть отдельно. Но если всю пачку выполнить в одной транзакции, то это точно быстрее и при передаче по сети может быть огромный выигрыш только на передаче.

В остальном же, надо исследование проводить. Самыми разными способами. Наличие профайлера, чтобы посмотреть, что именно на сервер пришло и сколько выполнялось, желательно. MS SQL Server - это все-таки СУБД высшего класса, с максимумом возможностей, что у других надо изучать возможности их средств администрирования. Кстати, профайлер иногда еще позволяет понять, что вообще посылает запрос, если где-то напортачено, и от проги, явно, идет какая-то активность, но непонятно из какого места.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
23.11.2023, 01:30
если параметры просто в цикле присваивать, то останутся только последние)
надо имена параметров менять тоже
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
23.11.2023, 02:10
Цитата Сообщение от S0563506 Посмотреть сообщение
Кстати проблема возможно не в коде. Когда я таскаю БД свой програмулины дома у меня ноутбук выполняет обнавление таблиц за 0,05 секунд (полный перезалив БД по ее дампу с удалением таблиц).
А когда на работу я притаскиваю БД, то она обновляется-пересоздается по запросу за 4-7 секунд, причем такое на 2ух компах. А компы на работе мощнее моего ноутбука будут.
Вот и разбирайтесь с вашим сисадмином.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
23.11.2023, 06:46  [ТС]
MySQL.

Цитата Сообщение от northener Посмотреть сообщение
Вот и разбирайтесь с вашим сисадмином.
)))) У нас сисадмин винду ставит 2 дня ))). "Секретный завод" - тут только таких держат.
Да и он тут не причем. Действа на локальной машине производятся.

Цитата Сообщение от Beltar Посмотреть сообщение
Да и в БД их хранить для многопользовательской базы, это на всех что-ли? Надо каждому юзеру отдельно.
Чето забыл что в теории можно к БД со множества экземпляров проги подключиться. Настрою основные размеры колонок огда визуально так сказать Defaultые значения., сохраню в бд. Надо потом будет в дальнейшем в ini файл вынести пожелания пользователя по ширине колонок и их последовательности.

Цитата Сообщение от Beltar Посмотреть сообщение
Ну для Query так пачку собрать можно, про CommandText не знаю.
Цитата Сообщение от krapotkin Посмотреть сообщение
если параметры просто в цикле присваивать, то останутся только последние)
надо имена параметров менять тоже
Попробую.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
23.11.2023, 15:05
вместо ini в этом веке я бы все-таки рекомендовал JSON)

я загуглил, в MySQL есть транзакции, можно попробовать открыть транзакцию в явном виде
выполнить все запросы, и сделать Commit
это вполне может помочь

если нет, то вариант со скриптом выглядит наиболее обещающим
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
24.11.2023, 01:52
Цитата Сообщение от S0563506 Посмотреть сообщение
)))) У нас сисадмин винду ставит 2 дня ))). "Секретный завод" - тут только таких держат.
Да и он тут не причем. Действа на локальной машине производятся.
Ага. Значит сисадмин всё-таки есть. И он что-то делает. Локальная ваша машина вероятно всё-таки сидит в локальной сети вашего предприятия?
Иначе я не понимаю в чём ещё могут быть ваши проблемы.
0
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
24.11.2023, 07:21  [ТС]
Попробовал создать простыню из запросов и отправить один раз, все равно медленно, хотя очень удивительно. Т.к. вместо 74 запросов всего 2.
В разы 4-5 медленнее чем на домашнем ноутбуке. Ну ладно не критично. Зато проработал вариант отправки запросов большими портянками.
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure ServiceSaveConfig;
begin
  try
    ShowMessage('1');
    //Запись в БД ширины колонок.
    with DM1.FDC1 do begin
      CommandText.Clear;
      for var I := 0 to Config.ColumnWidths.Count-1 do begin
        CommandText.Add('UPDATE info_fields SET ColumnWidth = :pColumnWidth'+IntToStr(I)+' WHERE FieldName = :pFieldName'+IntToStr(I)+';');
        ParamByName('pColumnWidth'+IntToStr(I)).AsInteger := StrToIntDef(Config.ColumnWidths.ValueFromIndex[I], 100);
        ParamByName('pFieldName'+IntToStr(I)).AsString := Config.ColumnWidths.Names[I];
      end;
      Execute;
    end;
 
 
    //Запист в БД последоваетельность показа колонок в DBGrid
    with DM1.FDC1 do begin
      CommandText.Clear;
      for var I := 0 to Config.ShowColumnsInCatalogByItemIndex.Count-1 do begin
      CommandText.Add('UPDATE tools_tip SET ShowColumnsInCatalog = :pShowColumnsInCatalog'+IntToStr(I)+' WHERE IdTip = :pIdTip'+IntToStr(I)+';');
 
        ParamByName('pShowColumnsInCatalog'+IntToStr(I)).AsString := Config.ShowColumnsInCatalogByItemIndex[I];
        ParamByName('pIdTip'+IntToStr(I)).AsInteger := StrToIntDef(Config.IdTipByItemIndex[I], -1);
 
      end;
          Execute;
    end;
  except
    MessageDlg('{457C259D-CDAD-4710-81A2-09CF56487F76}', mtError, [mbOk], 0);
  end;
end
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2023, 07:21
Помогаю со студенческими работами здесь

Очень медленное копирование файлов, разархивирование..
Всем привет! У меня проблема со скоростью копирования файлов, папок, архивов, особенно больших размеров, 4 гб архив (rar) может...

Медленное обновление объектов по таймеру
Делаю в windows forms классическую игру с планкой от которой отскакивает шарик и бьётся о края экрана уничтожая любые предназначенный для...

Очень медленное первое создание и показ окна
Чудес не бывает, понимаю, но может кто-нибудь что-нибудь посветует, дабы улучшить ситуацию. Приложение с 'DevExpress' (без него суть...

Крайне медленное обновление визуальной оболочки интерфейса
Суть проблемы вот в чем. Я переключился на использование встроенной видеокарты Intel HD 4600 и после этого у Windows 10 начались проблемы...

Очень медленное скачивание с одного компа на другой по локальной сети
Комп(win7 ultimate x64) и ноут(win7 домашняя базовая расширенная x64) соеденнены посредством модема. комп через провод к модему. Ноут через...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru