![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Добрый день, товарищи. Набросал небольшую утилиту, все работает прекрасно, кроме одного - скорости.
Суть проста - программа берет ровно 300 записей из MySQL, и записывает их в Microsoft SQL. Время выполнения - 12 мин. ![]() Вкратце : в первой базе есть около 700 таблиц, лишь 300 из них заполняются. Таблицы зовут как : 'T' + номер железяки. т.е. семьсот таблиц T1 - T700. В каждой из таблиц, есть столбцы : время, датчик, значение. Каждый час в таблицу пишется время, номер датчика (от 1 до 28) и значение этого датчика. В другой базе данных, в которую я и перетаскиваю данные, сделано чуть чуть по другому - там вместо трехсот таблиц, используется одна, в ней есть : имя, время, и 28 столбцов сотв-щих каждому датчику. Программа выбирает данные из первой базы, и пишет во вторую. Время это занимает - около 12-15 минут ![]() ![]() Может, я пишу код как муд*к? Сама процедура : Код:
for index := 1 to 728 do begin //читаем 720 таблиц t1 - t720 Application.ProcessMessages(); Line := ''; QMySQL.SQL.Clear(); // из базовой таблицы берем имя железяки, которое соответствует T + index QMySQL.SQL.Text := 'SELECT Name FROM rstt WHERE hO = ' + IntToStr(index); QMySQL.Open(); Device := QMySQL.FieldValues['Name']; i := 0; // теперь в таблице этой железяки мы 28 раз берем значения ее 28ми датчиков за указанное время while i < 28 do begin QMySQL.SQL.Clear(); QMySQL.SQL.Text := 'SELECT AV FROM t' + IntToStr(index) + ' WHERE (Time LIKE ' + #39 + GetValues('Data') + ' ' + GetValues('Hour') + '%' + #39 + ' ) AND (Sen = ' + IntToStr(i) + ')'; QMySQL.Open(); if QMySQL.FieldValues['AV'] <> null then L[i] := FloatToStr(RoundTo(StrToFloat(QMySQL.FieldValues['AV']),-2)); if QMySQL.FieldValues['AV'] = null then i := 50; QMySQL.Close; Inc(i); // и кладем их в массив end; if i < 50 then begin QMsSQL.SQL.Clear(); // раскладываем массив в запрос и посылаем в Ms SQL Vals := '(' + #39 + Copy(Device,Pos('s7',Device) + 6,5) + #39 + ',' + #39 + GetValues('Data') + #39 + ',' + #39 + GetValues('Hour') + #39 ; for z := 0 to 27 do Vals := Vals + ',' + #39 + L[z] + #39; Vals := Vals + ')'; QMsSQL.SQL.Text := 'INSERT INTO dbo.newbase' + ' (ObName,Data,Time,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,s26,s27,s28) VALUES ' + Vals; QMsSQL.ExecSQL(); end; end; Последний раз редактировалось alexusankov, 20.06.2013 в 09:57. |