powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как оптимизировать вот такой SQL запрос...
4 сообщений из 4, страница 1 из 1
Как оптимизировать вот такой SQL запрос...
    #32249088
perceptron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смысл в следующем:
Есть файл в котором содержатся тысячи записей.
Есть база данных в которую надо эти данные запихнуть...

Само занесение данных я делал с помощью ADO так:
(пример привожу на Delphi, но суть не в этом)

Temp2 := SaveRecStream.Size div M12_Detect; // определяю число записей которые заношу в базу

// Далее работаем с файлом через потоки

for j := 1 to Temp2 do
begin
SaveRecStream.ReadRec(M12Record); // читаю 1-ю запись
strSQL := 'SELECT chProfTitle FROM thlpProf where siCodeProf=' + M12Record.m120; // проверяю есть ли такая запись в базе
try
RS := NonVisualData.ADOConnection.Execute(strSQL); // собссно выполняю запрос
// Если записи с таким номером в базе нету то просто добавляю её в базу
with RS, NonVisualData.ADOQuery.SQL do
begin
if (EOF) then
begin
Clear;
Add('INSERT INTO thlpProf (siCodeProf, chProfTitle) Values ('+ M12Record.m120 + ', '''+ M12Record.m121 +''')');
NonVisualData.ADOQuery.ExecSQL;
end
else // если запись в базе уже есть, то делаю UPDATE записи
begin
Clear;
Add('UPDATE thlpProf SET chProfTitle = '''+ M12Record.m121 + ''' WHERE siCodeProf = ' + M12Record.m120 );
NonVisualData.ADOQuery.ExecSQL; //SaveRecord.m121
end;
end;
except
showmessage('Ошибка добавления M12');
end;
SaveRecStream.Free;

Вот этот участок кода при числе записей в файле = 4500 выполняется у меня на Celeron-733 где-то 18 сек. И вся прога в целом подвисает на время выполнения, то бишь проц юзается почти на все 100 %,
что делает невозможным перерисовку некоторых информационных полей видимых на форме главного приложения (всё идёт в одном потоке вместе с самим приложением, а смысла пускать в отдельный поток занесение данных я тут прямо говоря невижу да и синхронизировать как-то придётся - может быть я и неправ ), так как приоритет перерисовки в данный момент меньше, чем приоритет вышеприведенной операции занесения данных в базу. Отсюда вытекает следующее: Как мне решить 2 вопроса:
1) Как мне сделать так чтобы время занесения данных в базу было меньше.
2) Как мне уменьшить нагрузку на проц - чтобы данный участок кода не хапал все ресурсы системы?

По ходу мне в башку приходит тока следующее:
1) Может быть считывать базу сразу целиком себе и локально с ней работать а потом скинуть её уже обработанную обратно на сервер
2) Занесение данных производить в отдельном от основного приложения потоке - но тут встаёт вопрос с синхронизацией...

Щаз буду пробовать через потоки и критические секции чтобы отделить выполнение основного потока от потока заполнения базы....

Посоветуйте мне пжалуйста как лучше поступить в данной ситуации...
...
Рейтинг: 0 / 0
Как оптимизировать вот такой SQL запрос...
    #32249099
Papka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй SP. Все пихай туда и передавай только параметры. Пусть SP разбирает добавлять или изменять запись на сервере.
...
Рейтинг: 0 / 0
Как оптимизировать вот такой SQL запрос...
    #32249156
perceptron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я как-то и не подумал про SP. Спасибо. Попробую!
...
Рейтинг: 0 / 0
Как оптимизировать вот такой SQL запрос...
    #32249167
Papka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удачи
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как оптимизировать вот такой SQL запрос...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]