Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Виснущая ХП / 12 сообщений из 12, страница 1 из 1
23.12.2003, 17:56
    #32361279
hyh
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
23.12.2003, 18:05
    #32361296
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виснущая ХП
А сервер напомни ?

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

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

ORDNUM,FFDOCTYPE,STATECODE

Best regards,
Dnico.
...
Рейтинг: 0 / 0
24.12.2003, 18:36
    #32362492
hyh
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
24.12.2003, 18:44
    #32362504
Dnico
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виснущая ХП
Напиши пожалуйста, какие у тебя есть индексы по таблицам.
Желательно все.
Может чего и подскажу.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
24.12.2003, 18:54
    #32362517
hyh
hyh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виснущая ХП
Natural везде идёт только FULFILDOC, индекс по FULFILDOC(INPDATE) запросы
не ускоряет, по FULFILDOC(NUM, INPDATE) не используется
(в явном виде писать не буду, тк баз несколько и системное именование индексов в них может различаться)
Все что есть сейчас найду..
Но если бы дело было в индексах, ведь тормозили бы сами запросы?
...
Рейтинг: 0 / 0
24.12.2003, 19:26
    #32362541
hyh
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
05.01.2004, 11:45
    #32368391
hyh
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Виснущая ХП / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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