powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Виснущая ХП
12 сообщений из 12, страница 1 из 1
Виснущая ХП
    #32361279
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
CREATE PROCEDURE Rep_PH (
    D1 TIMESTAMP,
    D2 TIMESTAMP)
RETURNS (
    ID CHAR( 2 ),
    ORGNAME VARCHAR( 80 ),
    SERVICEPERCENT NUMERIC( 9 ,  2 ),
    ZT NUMERIC( 9 ,  2 ),
    CC INTEGER,
    LT NUMERIC( 9 ,  2 ),
    NT NUMERIC( 9 ,  2 ),
    RT NUMERIC( 9 ,  2 )
)
AS
BEGIN
FOR 
SELECT DISTINCT O2.ID
FROM ORDITEMSTATE O1,
 FULFILDOC F, ORD O2
WHERE
 (((O1.FFDOCTYPE = 'A') AND (O1.STATECODE IN ('0','1')))
  OR (O1.FFDOCTYPE IN ('L','R'))
 )
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= :D1)
 AND (F.INPDATE <= :D2)
 AND (O1.ordnum = O2.num)
into :ID
do begin
  ZT= 0 ;
  CC= 0 ;
  LT= 0 ;
  RT= 0 ;
  select  a.ORGNAME, a.SERVICEPERCENT
  from INTERMED a
  where a.ID = :ID
  INTO  :ORGNAME, :SERVICEPERCENT;

  select sum(b.TOTAL) from
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (e.ID = :ID) and (d.ORDNUM = e.NUM) and 
  (b.ITEMNUM = d.ITEMNUM) and
  (b.ORDNUM = d.ORDNUM) and
  (d.FFDOCTYPE = 'A') and (d.STATECODE IN ('0','1')) 
  and (c.NUM = d.FFDOCNUM) 
  and (c.INPDATE >= :D1 and c.INPDATE <= :D2 ) )
  INTO :ZT ;

  select count (DISTINCT e.CLNUM) from
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (e.ID = :ID) and (d.ORDNUM = e.NUM) and 
  (b.ITEMNUM = d.ITEMNUM) and
  (b.ORDNUM = d.ORDNUM) and
  (d.FFDOCTYPE = 'A') and (d.STATECODE IN ('0','1')) 
  and (c.NUM = d.FFDOCNUM) 
  and (c.INPDATE >= :D1 and c.INPDATE <= :D2 ) )
  INTO :CC ;

  select sum (b.TOTAL) 
  from 
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (e.ID = :ID) and (d.ORDNUM = e.NUM) and 
  (b.ITEMNUM = d.ITEMNUM) and
  (b.ORDNUM = d.ORDNUM) and
  (c.NUM = d.FFDOCNUM) and (c.FFDOCT = 'R') 
  and (c.INPDATE >= :D1 and c.INPDATE < :D2 ) )
  INTO :RT ;

  select sum (b.TOTAL) 
  from 
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (e.ID = :ID) and (d.ORDNUM = e.NUM) and 
  (b.ITEMNUM = d.ITEMNUM) and
  (b.ORDNUM = d.ORDNUM) and
  (c.NUM = d.FFDOCNUM) and (c.FFDOCT = 'L') 
  and (c.INPDATE >= :D1 and c.INPDATE < :D2 ) )
  INTO :LT ;

  NT=LT-RT;  
  SUSPEND;
  END


END
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361296
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сервер напомни ?

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361323
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать FB 1.5, то можно объединить явно загруженные два запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
   /*
  SELECT SUM (b.TOTAL) 
  FROM 
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  WHERE
  ( (e.ID = :ID) AND (d.ORDNUM = e.NUM) AND 
  (b.ITEMNUM = d.ITEMNUM) AND
  (b.ORDNUM = d.ORDNUM) AND
  (c.NUM = d.FFDOCNUM) AND (c.FFDOCT = 'R') 
  AND (c.INPDATE >= :D1 AND c.INPDATE < :D2 ) )
  INTO :RT ;

  SELECT SUM (b.TOTAL) 
  FROM 
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  WHERE
  ( (e.ID = :ID) AND (d.ORDNUM = e.NUM) AND 
  (b.ITEMNUM = d.ITEMNUM) AND
  (b.ORDNUM = d.ORDNUM) AND
  (c.NUM = d.FFDOCNUM) AND (c.FFDOCT = 'L') 
  AND (c.INPDATE >= :D1 AND c.INPDATE < :D2 ) )
  INTO :LT ;
  */ 

  SELECT
  SUM (CASE c.FFDOCT WHEN 'R' THEN b.TOTAL ELSE  0  END),
  SUM (CASE c.FFDOCT WHEN 'L' THEN b.TOTAL ELSE  0  END)
  FROM
  ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  WHERE
  ( (e.ID = :ID) AND (d.ORDNUM = e.NUM) AND 
  (b.ITEMNUM = d.ITEMNUM) AND
  (b.ORDNUM = d.ORDNUM) AND
  (c.NUM = d.FFDOCNUM) AND (c.FFDOCT IN ('L','R'))
  AND (c.INPDATE >= :D1 AND c.INPDATE < :D2 ) )
  INTO :RT, :LT ;

  NT=LT-RT;




Best regards,
Dnico.
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361334
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер IB 7.0
Хотя CASE вроде было гдето на форуме написано как определить под IB
Но тут торможение начинается еще с основного запроса ХП...
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361335
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько записей выдает COUNT по основному запросу?

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361342
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря) при попытке подсчета количества записей отдельно
записанного основного запроса(for select'a) он виснет)
Ну а при нормальной работе такой запрос
(и соответственно ХП в целом)
должен давать всего-то в районе сотни записей )
...
Рейтинг: 0 / 0
Виснущая ХП
    #32361373
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать сделать индекс по полям таблицы
ORDITEMSTATE

ORDNUM,FFDOCTYPE,STATECODE

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Виснущая ХП
    #32362492
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
CREATE PROCEDURE Rep_PH (
    D1 TIMESTAMP,
    D2 TIMESTAMP)
RETURNS (
    ID CHAR( 2 ),
    ORGNAME VARCHAR( 80 ),
    SERVICEPERCENT NUMERIC( 9 ,  2 ),
    ZT NUMERIC( 9 ,  2 ),
    CC INTEGER,
    LT NUMERIC( 9 ,  2 ),
    NT NUMERIC( 9 ,  2 ),
    RT NUMERIC( 9 ,  2 )
)
AS
BEGIN
FOR 
SELECT
  DISTINCT O2.ID
FROM
  FULFILDOC F
    LEFT JOIN ORDITEMSTATE O1 ON (F.NUM = O1.FFDOCNUM)
    LEFT JOIN ORD O2 ON (O1.ORDNUM = O2.NUM)
WHERE
  (F.INPDATE >= :D1) AND (F.INPDATE <= :D2) AND
 (((O1.FFDOCTYPE = 'A') AND (O1.STATECODE IN ('0','1')))
 OR
 (O1.FFDOCTYPE IN ('L','R')) )
 into :ID
 do begin
 IF (ID IS NOT NULL) THEN BEGIN
  ZT= 0 ;
  CC= 0 ;
  LT= 0 ;
  RT= 0 ;
  select  a.ORGNAME, a.SERVICEPERCENT
  from INTERMED a
  where a.ID = :ID
  INTO  :ORGNAME, :SERVICEPERCENT;

  SELECT sum(b.TOTAL)
  FROM
  FULFILDOC c
    LEFT JOIN ORDITEMSTATE d ON (c.NUM = d.FFDOCNUM)
    LEFT JOIN ORDITEM b ON ((d.ORDNUM = b.ORDNUM) AND (d.itemnum = b.ITEMNUM))
    LEFT JOIN ORD e ON (d.ORDNUM = e.NUM)
  WHERE
  (c.INPDATE >= :D1) AND (c.INPDATE <= :D2) AND
  (d.FFDOCTYPE = 'A') AND (d.STATECODE IN ('0','1'))
  AND (e.id = :ID )
  INTO :ZT ;

  select count (DISTINCT e.CLNUM)
  FROM
  FULFILDOC c
    LEFT JOIN ORDITEMSTATE d ON (c.NUM = d.FFDOCNUM)
    LEFT JOIN ORDITEM b ON ((d.ORDNUM = b.ORDNUM) AND (d.itemnum = b.ITEMNUM))
    LEFT JOIN ORD e ON (d.ORDNUM = e.NUM)
  WHERE
  (c.INPDATE >= :D1) AND (c.INPDATE <= :D2) AND
  (d.FFDOCTYPE = 'A') AND (d.STATECODE IN ('0','1'))
  AND (e.id = :ID )
  INTO :CC ;


  select sum (b.TOTAL)
  FROM
  FULFILDOC c
    LEFT JOIN ORDITEMSTATE d ON (c.NUM = d.FFDOCNUM)
    LEFT JOIN ORDITEM b ON ((d.ORDNUM = b.ORDNUM) AND (d.itemnum = b.ITEMNUM))
    LEFT JOIN ORD e ON (d.ORDNUM = e.NUM)
  WHERE
  (c.INPDATE >= :D1) AND (c.INPDATE <= :D2)
  AND (d.FFDOCTYPE = 'R')
  AND (e.id = :ID )
  INTO :RT ;

  select sum (b.TOTAL)
  FROM
  FULFILDOC c
    LEFT JOIN ORDITEMSTATE d ON (c.NUM = d.FFDOCNUM)
    LEFT JOIN ORDITEM b ON ((d.ORDNUM = b.ORDNUM) AND (d.itemnum = b.ITEMNUM))
    LEFT JOIN ORD e ON (d.ORDNUM = e.NUM)
  WHERE
  (c.INPDATE >= :D1) AND (c.INPDATE <= :D2)
  AND (d.FFDOCTYPE = 'L')
  AND (e.id = :ID )
  INTO :LT ;

  NT=LT-RT;  
  SUSPEND;
  END
  END


END


Переделанная в таком виде процедура,
всё еще виснет), хотя все подзапросы, будучи исполнены отдельно в experte,
выполняются в рамках 3.5 секунд(каждый). В чем могёт быть проблема?
...
Рейтинг: 0 / 0
Виснущая ХП
    #32362504
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши пожалуйста, какие у тебя есть индексы по таблицам.
Желательно все.
Может чего и подскажу.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Виснущая ХП
    #32362517
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Natural везде идёт только FULFILDOC, индекс по FULFILDOC(INPDATE) запросы
не ускоряет, по FULFILDOC(NUM, INPDATE) не используется
(в явном виде писать не буду, тк баз несколько и системное именование индексов в них может различаться)
Все что есть сейчас найду..
Но если бы дело было в индексах, ведь тормозили бы сами запросы?
...
Рейтинг: 0 / 0
Виснущая ХП
    #32362541
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, индексы:

INTERMED : ID
ORD : ID, NUM, CLNUM, DATEJOIN, (ID,DEPARTID,ORDNUM1), FFDOCNUM
ORDITEMSTATE : (ORDNUM, ITEMNUM), FFDOCNUM, (FFDOCTYPE,STATECODE), (ORDNUM,ITEMNUM,ITEMSTATENUM)
FULFILDOC : FFDOCT, OPRID, NUM
ORDITEM : ORDNUM, (ORDNUM,PARTNUM), (FFDOCTYPE,FULFILSTATECODE), (ORDNUM,ITEMNUM)
...
Рейтинг: 0 / 0
Виснущая ХП
    #32368391
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
CREATE PROCEDURE Rep_PH (
    D1 TIMESTAMP,
    D2 TIMESTAMP)
RETURNS (
    ID CHAR( 2 ),
    ORGNAME VARCHAR( 80 ),
    SERVICEPERCENT NUMERIC( 9 ,  2 ),
    ZT NUMERIC( 9 ,  2 ),
    CC INTEGER,
    LT NUMERIC( 9 ,  2 ),
    NT NUMERIC( 9 ,  2 ),
    RT NUMERIC( 9 ,  2 )
)
AS
DECLARE VARIABLE T  NUMERIC( 9 ,  2 );
DECLARE VARIABLE DT CHAR( 1 );
DECLARE VARIABLE C integer;
DECLARE VARIABLE CCC integer;
BEGIN
c= 0 ;
FOR select e.ID, d.FFDOCTYPE, sum (b.TOTAL), count (DISTINCT e.CLNUM)
  FROM
  FULFILDOC c
    LEFT JOIN ORDITEMSTATE d ON (c.NUM = d.FFDOCNUM)
    LEFT JOIN ORDITEM b ON ((d.ORDNUM = b.ORDNUM) AND (d.itemnum = b.ITEMNUM))
    LEFT JOIN ORD e ON (d.ORDNUM = e.NUM)
  WHERE
  (c.INPDATE >= :D1) AND (c.INPDATE < :D2)
  AND ( (d.FFDOCTYPE IN ('R','L')) OR ((d.FFDOCTYPE = 'A') AND (d.STATECODE IN ('0','1'))) )
  group by e.ID, d.FFDOCTYPE
  order by e.ID
  INTO :ID, :DT, :T, :CCC 
 do begin
 IF (ID IS NOT NULL) THEN BEGIN
   IF (DT='R') then begin
                    RT=T;
                    c=c+ 1 ;
                    end
     ELSE 
     begin
     IF (DT='L') then begin
                      LT=T;
                      c=c+ 1 ;
                      end
         ELSE
         begin
         ZT=T;
         CC=CCC;
         c=c+ 1 ;
         end 
     end  
 
  IF (c= 3 ) then begin NT=LT-RT; 
                      select  a.ORGNAME, a.SERVICEPERCENT
                      from INTERMED a
                      where a.ID = :ID
                      INTO  :ORGNAME, :SERVICEPERCENT;
                      SUSPEND;
                      c= 0 ;
                      ZT= 0 ;
                      LT= 0 ;
                      RT= 0 ;
                      CC= 0 ;
                end
  END
  END

END


Работает оно полминуты.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Виснущая ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]