Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

Странно зависает запрос.   Найти похожие ветки 

 
pavel_guzhanov ©   (2008-11-19 12:06) [0]

Вот такой запрос:
   IBQFil.Close;
   IBQFil.SQL.Clear;
   IBQFil.SQL.Add("select a.accn_id, a.accn_name, a.curr_state, a.status, c.Cont_type, a.open_date from accn a");
   IBQFil.SQL.Add("join cont c on c.cont_id=a.cont_id");
   IBQFil.SQL.Add("where a.memb_id=:m");


далее в программе передаю параметр:

       IBQFil.Close;
IBQFil.Params[0].AsInteger:=IBQRef.FieldByName("memb_id").AsInteger;
       S:=IBQFil.SQL.Text;
       IBQFil.Open;//<<<<<<<<<
       IBQFil.First;


На помеченной строке программа зависает очень надолго (десятки минут)

Если я на той же базе выполняю тот же запрос в IBExpert, передавая ему тот же параметр, то запрос выполняется мгновенно.

Кроме того, в программе этот запрос выполняется в цикле, и зависает только при первой итерации цикла, в остальных итерациях тоже отрабатывает мгновенно. Я пробовал проделать это на двух разных базах (базы разных филиалов), получается тоже самое - первая итерация - зависание, последующие итерации - нормально.

От чего может быть это зависание и как с ним бороться?


 
sniknik ©   (2008-11-19 12:30) [1]

в Firebird первый может тормозить из за начальной подгрузки dll, если например ембедед версия используется. сервер в принципе тоже время на "раскрутку"  может требовать, но десятки минут... это черезчур в обоих случаях, это у тебя в программе глюк.


 
Правильный$Вася   (2008-11-19 12:52) [2]

автоматическая сборка мусора?


 
Сергей М. ©   (2008-11-19 14:07) [3]


> этот запрос выполняется в цикле


Перед первой итерацией коннект с базой уже установлен ?


 
pavel_guzhanov ©   (2008-11-19 15:05) [4]

procedure TMainForm.BRefRemNPOClick(Sender: TObject);
var ...
begin
 puth:=GetCurrentDir;

 try
   if not IBDBRemContr.Connected then
   begin
     IBDBRef.DatabaseName:="localhost:"+puth+"\Users.fdb";
     IBDBRef.Params.Add("user_name=SYSDBA");
     IBDBRef.Params.Add("password=masterkey");
     IBDBRef.Connected:=true;
   end;
   IBQFil.Close;
   IBQFil.SQL.Clear;
   IBQFil.SQL.Add("select a.accn_id, a.accn_name, a.curr_state, a.status, c.Cont_type, a.open_date from accn a");
   IBQFil.SQL.Add("join cont c on c.cont_id=a.cont_id");
   IBQFil.SQL.Add("where a.memb_id=:m");

   for i:=1 to 28 do
   begin
     IBDBFil.Connected:=false;
     IBDBFil.DatabaseName:="localhost:"+Puth+"\npfe_"+IntToStr(i)+".fdb";
     IBDBFil.Params.Add("user_name=SYSDBA");
     IBDBFil.Params.Add("password=masterkey");
     try
       IBDBFil.Connected:=true;
      except
       ShowMessage("Нет соединения с базой");
       continue;
     end;
     IBQKorpFlag.Close;
     IBQKorpFlag.Open;
     IBQRef.Close;
     IBQRef.SQL.Clear;
     IBQRef.SQL.Add("select count(*) as kol from users where filial_no=:f");
     IBQRef.Params[0].Value:=i;
     IBQRef.Open;
     PB3.Max:=IBQRef.FieldByName("kol").AsInteger;
     IBQRef.Close;
     IBQRef.SQL.Clear;
     IBQRef.SQL.Add("select id, memb_id from users where filial_no=:f");
     IBQRef.Params[0].Value:=i;
     IBQRef.Open;
     IBQRef.First;
     PB3.Position:=0;
     while not IBQRef.Eof do
     begin
       PB3.Position:=PB3.Position+1;
       IBQFil.Close;
       IBQFil.Params[0].AsInteger:=IBQRef.FieldByName("memb_id").AsInteger;
       S:=IBQFil.SQL.Text;
       IBQFil.Open; // здесь зависаем
       IBQFil.First;
       while not IBQFil.Eof do


Вот полностью код процедуры до места зависания. Не вижу места для глюка :о)).

Коннект с базой установлен, как видно из приведенного кода.


 
Правильный$Вася   (2008-11-19 15:44) [5]


> for i:=1 to 28 do    begin      IBDBFil.Connected:=false;

диковинная штука

> PB3.Position:=0;
IBQFil.Prepare;
> while not IBQRef.Eof do
>      begin
>        PB3.Position:=PB3.Position+1;        IBQFil.Close;
>         IBQFil.Params[0].AsInteger:=IBQRef.FieldByName("memb_id").
> AsInteger;


 
pavel_guzhanov ©   (2008-11-19 15:58) [6]


> IBQFil.Prepare;


Prepare действительно надо делать до передачи параметра запросу?


 
pavel_guzhanov ©   (2008-11-19 16:10) [7]

Теперь также точно виснет на IBQFil.Prepare;


 
pavel_guzhanov ©   (2008-11-19 16:21) [8]

База объемом 400 Мб, но BDQRef возвращает примерно 60 тысяч записей. Зависание при первой итерации цикла примерно 30 минут, при открытии IBQFil. IBQFil возвращает от 1 до десяти записей. База другого филиала, весит примерно 250 Мб, зависает при первой итерации примерно на 10 минут. Но баз у меня 28 штук, таких больших штук 8, остальные до 100 Мб.


 
pavel_guzhanov ©   (2008-11-19 16:22) [9]


>  но BDQRef возвращает

пардон, IBQRef


 
Правильный$Вася   (2008-11-19 16:22) [10]


> Prepare действительно надо делать до передачи параметра запросу?

только тип параметра установи до этого

> Теперь также точно виснет на IBQFil.Prepare;

сборку мусора делал?


 
pavel_guzhanov ©   (2008-11-19 16:25) [11]


> сборку мусора делал?


Пардон за глупый вопрос: а как?


 
Правильный$Вася   (2008-11-19 16:39) [12]


> Пардон за глупый вопрос: а как?

простейший способ - через gfix -sweep


 
pavel_guzhanov ©   (2008-11-20 08:12) [13]

Сделал, результат нулевой. Тоесть виснет также. Перед gfix сделал еще backup/restore...


 
StriderMan   (2008-11-20 15:32) [14]

есть одна мысль. замечал такие тормоза, когда клиентская библиотека gds32.dll была от Interbase а сервер - firebird.

IBQFil это TIBQuery?  попробуй на TIBSQL поменять, он легче и быстрее


 
atruhin ©   (2008-11-20 15:54) [15]

Приведи метаданные для accn, cont. И план запроса.


 
atruhin ©   (2008-11-20 15:54) [16]

Приведи метаданные для accn, cont. И план запроса.


 
PEAKTOP ©   (2008-11-20 18:29) [17]

Попробуй подконнектиться к базе из  Firebird 2.0 и выше и задать параметры транзакции
isc_tpb_read_commited
isc_tpb_write
isc_tpb_rec_version
isc_tpb_nowait
Если глюк не вопроизведется, то батенька запустили Вы ваши базы данных. Backup-Retore им нуна срочно.

Да, кстати, чуть не забыл

...............
BDBFil.Connected:=false;
    IBDBFil.DatabaseName:="localhost:"+Puth+"\npfe_"+IntToStr(i)+".fdb";
    IBDBFil.Params.Add("user_name=SYSDBA");
    IBDBFil.Params.Add("password=masterkey");
......

Где чарсет подключения ?

    IBDBFil.Params.Add("lc_ctype=WIN1251");


 
Правильный$Вася   (2008-11-20 21:02) [18]


> запустили Вы ваши базы данных. Backup-Retore им нуна срочно.

ты невнимателен
см [13]


 
pavel_guzhanov ©   (2008-11-21 15:30) [19]

Все решилось очень странным образом, я еще буду разбираться, что сие означает. Взял с сервера более свежие базы филиалов - и все заработало без проблем. На базах месячной давности все висло, несмотря на backup/restore и gfix -sweep



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.005 c
1-1215965666
dmitry_12_08_73
2008-07-13 20:14
2009.09.20
Диалоговое окно не должно перекрываться другими окнами


15-1248171535
Jeer
2009-07-21 14:18
2009.09.20
ГИС по китайски


15-1247764231
Polkin
2009-07-16 21:10
2009.09.20
Что-то с svchost.exe


1-1215159636
Sashka
2008-07-04 12:20
2009.09.20
Реализуемо ли? Форма в Форме


11-1205742423
catdog
2008-03-17 11:27
2009.09.20
Удаление переменных из памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский