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

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

05.01.2014, 13:32. Показов 3636. Ответов 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,977
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,977
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
Ответ Создать тему
Новые блоги и статьи
Химера правил, администации порталов, законы и беззаконие.
Hrethgir 26.06.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11904&stc=1&d=1782459438 У меня сейчас так везде по форуму - не могу создавать сообщений, но запись по случаю этому. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru