Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как оптимизировать вот такой SQL запрос...
|
|||
|---|---|---|---|
|
#18+
Смысл в следующем: Есть файл в котором содержатся тысячи записей. Есть база данных в которую надо эти данные запихнуть... Само занесение данных я делал с помощью 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) Занесение данных производить в отдельном от основного приложения потоке - но тут встаёт вопрос с синхронизацией... Щаз буду пробовать через потоки и критические секции чтобы отделить выполнение основного потока от потока заполнения базы.... Посоветуйте мне пжалуйста как лучше поступить в данной ситуации... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2003, 16:20 |
|
||
|
Как оптимизировать вот такой SQL запрос...
|
|||
|---|---|---|---|
|
#18+
Используй SP. Все пихай туда и передавай только параметры. Пусть SP разбирает добавлять или изменять запись на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2003, 16:29 |
|
||
|
Как оптимизировать вот такой SQL запрос...
|
|||
|---|---|---|---|
|
#18+
я как-то и не подумал про SP. Спасибо. Попробую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2003, 17:02 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32249088&tid=2117125]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 357ms |

| 0 / 0 |
