Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
2 / 2 / 2
Регистрация: 03.08.2012
Сообщений: 83

Долго исполняется запрос

05.01.2014, 13:32. Показов 3735. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача процедуры massClick, раз в минуту(по таймеру) заносить данные (около 600 строк) в таблицу БД MSSQL из ListBox.
Структура таблицы БД: dt (smalldatetime), ObjID (Int), Val (float).
Но происходит следующее:
Данные заносятся раз в 3-4 минуты, а иногда и вовсе приложение "не отвечает", зависает чтоли...
Подскажите в чём дело.., код не оптимален? или ещё что?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.massClick(Sender: TObject);
var
i,j:integer;
begin
 ADOConnection1.ConnectionString:='FILE NAME='+Form1.Caption+'.udl';
 ADOConnection1.Connected:=true;
 ADOQuery1.SQL.Clear;
  j:=0;
   for i:=0 to StrToInt(TITcnt.Caption)-1 do
   begin
 Inc(j);
  ADOQuery1.SQL.Text:='set dateformat dmy IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[dbo].['+Form1.Caption+''+'min'+']'')) insert into [dbo].['+Form1.Caption+''+'min'+'] values ('+#39+datetimetostr(now)+#39+','+IntToStr(j)+','+StringReplace(FloatToStr(StrToFloat(TITvalue.Items[i])),',','.',[rfReplaceAll])+')';
  ADOQuery1.ExecSQL;
   end;
ADOQuery1.Connection.Close;
ADOConnection1.Connected:=false;
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2014, 13:32
Ответы с готовыми решениями:

SQL-запрос долго выполняется (INSERT)
ПРочитал много, так и не нашел вразумительного ответа... Может кто чем поможет. В общем, при добавлении в таблицу очень долго, порядка 3-х...

Запрос не всегда исполняется
в чем проблема, подскажите плз P.S. Иногда запрос исполняется, но редко INSERT INTO `bakalavr`.`meteo_info` (`date`, `temperature`,...

Из фразы "Сашеньке вчера исполняется 120 лет" получить фразу "Саше завтра исполняется 12 лет"
Из фразы "Сашеньке вчера исполняется 120 лет" получить фразу "Саше завтра исполняется 12 лет", используя проц Program Primer9;...

24
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
19.01.2014, 12:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kwinto Посмотреть сообщение
накидал небольшой тест
Именно поэтому я про справку тебе и написал. Prepared:=true имеет смысл лишь в случае многократного использования одного и того же запроса с использованием параметров.
Какое отношение это имеет к данной теме?
0
86 / 86 / 24
Регистрация: 27.02.2010
Сообщений: 397
19.01.2014, 12:35
Самое прямое отношение. Тема здесь называется "Долго исполняется запрос".
В первом же сообщении я написал, что нужно запрос фомировать вне цикла, а это подразумевает собой использование параметров, и обязательно давать prepare, что существенно снизит время вставки. Только на этом простом действии можно очень много выиграть, не вдаваясь в подробности самого запроса и структуры БД.
0
2 / 2 / 2
Регистрация: 03.08.2012
Сообщений: 83
19.01.2014, 15:35  [ТС]
Возможно я ошибаюсь, но мне кажется, что kwinto просто не прочёл весь мой диалог с FIL от начало до конца, где руководствуясь советами FIL появился код, в котором, как пишет kwinto
ADOQuery1.SQL.Text вынесен перед циклом
поэтому приведу пример кода снова:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TFMain.massClick(Sender: TObject);
var
i:integer;
begin
ADOQuery1.Connection.Close;
 ADOConnection1.ConnectionString:='FILE NAME='+FMain.Caption+'.udl';
 ADOConnection1.Connected:=true;
 ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text:='set dateformat dmy IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[dbo].['+FMain.Caption+''+'min'+']'')) insert into [dbo].['+FMain.Caption+''+'min'+'] select '+#39+datetimetostr(now)+#39+' as dt,1 as RecordID,'+LBResult.Items[0]+' as Val';
   for i:=1 to StrToInt(EVarNum.Text)-1 do
   ADOQuery1.SQL.Add('union all select'+#39+datetimetostr(now)+#39+','+IntToStr(i+1)+','+LBResult.Items[i]);
 ADOQuery1.ExecSQL;
ADOConnection1.Connected:=false;
ibd.Font.Color:=clRed;
ADOQuery1.Connection.Close;
end;
Вопрос kwinto: Как ещё оптимизировать работу процедуры massClick?
Вопрос FIL:
1)Верно ли утверждение, что решить проблему заменой smalldatetime на datetime равнозначно снятию ключа с
dt (если честно, этот вариант не очень по душе)?
2)Насколько координально увеличить таймер (сделать больше минуты)? И можно ли будет после этого утверждать, что в течении часа в таблицу БД SQL войдёт 60 значений? Или их будет 58? иль 59? сколько?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
19.01.2014, 16:16
1. Нет. Смена типа увеличит точность времени до долей сек., что сведет к 0 вероятность повтора ключей. При этом, поле останется ключевым.
2. Определяется экспериментально, но, если ошибка возникает пару раз за сутки, то, думаю, что увеличение нужно на доли сек. Но 60 значений в час уже не будет.
Другой вариант: брать значение времени перед составлением запроса, округлять до минут (как делает SQL) и сравнивать со значением, полученным в предидущий раз - если совпадут, то увеличить на мин. И в запрос подставлять уже готовое значение, а не вычислять 600 раз datetimetostr(now) - это тоже время сэкономит.

Еще строки 5, 8, 15 из кода можно убрать.
1
2 / 2 / 2
Регистрация: 03.08.2012
Сообщений: 83
19.01.2014, 19:42  [ТС]
Сделал таймер = 61000 и завёл переменную dt.
Буду смореть...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TFMain.massClick(Sender: TObject);
var
i:integer;
dt:word;
begin
dt:=datetimetostr(now);
ADOQuery1.Connection.Close;
 ADOConnection1.ConnectionString:='FILE NAME='+FMain.Caption+'.udl';
 ADOConnection1.Connected:=true;
 ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text:='set dateformat dmy IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[dbo].['+FMain.Caption+''+'min'+']'')) insert into [dbo].['+FMain.Caption+''+'min'+'] select '+#39+dt+#39+' as dt,1 as RecordID,'+LBResult.Items[0]+' as Val';
   for i:=1 to StrToInt(EVarNum.Text)-1 do
   ADOQuery1.SQL.Add('union all select'+#39+dt+#39+','+IntToStr(i+1)+','+LBResult.Items[i]);
 ADOQuery1.ExecSQL;
ADOConnection1.Connected:=false;
ibd.Font.Color:=clRed;
ADOQuery1.Connection.Close;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2014, 19:42

Долго выполняеся Get запрос
Добрый день! ИНтересна суть проблемы, есть контроллер: public async Task<JsonResult> GraphToday(string pDateGraph, int...

Долго выполняется запрос к БД
Добрый день. Есть в БД табличка с 192 полями, в ней может быть около 100 тыс. записей. запрос count(*) выполняется 1,31 сек. а выбор...

Долго выполняется запрос
Приходят в GET слова для работы с БД, все работает хорошо, кроме одного словочитания, база данных возвращает значения, но это происходит...

Долго выполняется запрос
Всем привет. Довольно долго (порядка 30-40 секунд) выполняется запрос. Подскажите где, что неправильно и как его можно ускорить. ...

MS SQL. Запрос долго выполняется
Доброго времени суток! Помогите разобраться почему запрос долго выполняется select max(Id) as id FROM gftec WHERE ID_TEC=6 GROUP BY...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru