Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.012 c
15-1248288596
Kerk
2009-07-22 22:49
2009.09.20
У меня почерк хреновый


15-1248421324
Amid
2009-07-24 11:42
2009.09.20
Помогите перевести код из Си в Делфи


1-1215171753
asafr
2008-07-04 15:42
2009.09.20
InterBase и FreeLibrary


2-1248180547
artemm
2009-07-21 16:49
2009.09.20
подсчет одинаковых строк


3-1227136044
Petr V. Abramov
2008-11-20 02:07
2009.09.20
forall и bulk collect into