Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.06.2013, 09:48
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию низкая скорость запросов (

Добрый день, товарищи. Набросал небольшую утилиту, все работает прекрасно, кроме одного - скорости.
Суть проста - программа берет ровно 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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025