powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выполнение очень долгого запроса.
51 сообщений из 51, показаны все 3 страниц
Выполнение очень долгого запроса.
    #32333147
Death
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Ситуация следующая. При вставке записи в определенную таблицу, сробатывает не слабый триггер, который добовляет множество записей в ряд других таблиц. Выполняется такой запрос долго и в итоге вылазит ошибка с кодом 693 335544663, что интерпритируется как Too many concurrent executions of the same request. Работаю через IBX
Я пробовал задать в IBTransaction1.IdleTimer очень большое значение, например 1000000, но это не помогает. Кто нить знает, как можно решить эту проблему? Спасибо.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32333280
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не циклится ли тригер?

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32333281
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ж сколько записей надо вставить чтобы такое вылезло? !!!
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32333283
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я один раз папку саму в себя стал копировать ... красиво получилось!
Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32333285
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, поподробнее, пожалуйста
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32345344
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с чем может быть связано очень долгое выполнение (зависание? не хватило терпения ждать больше 15ти минут ;P),
с небольшой (~5%) при этом загрузкой процессора, следующего запроса :
create view q1
(ID, ORGNAME, SERVICEPERCENT)
as select distinct
a.ID, a.ORGNAME, a.SERVICEPERCENT
from
INTERMED a, ORD b
where ((a.ID = b.ID) and
(b.DATEJOIN >= :D1 and b.DATEJOIN <= :D2 ))

UNION ALL

select distinct
a.ID as ID, a.ORGNAME as ORGNAME,
a.SERVICEPERCENT as SERVICEPERCENT
from
INTERMED a, FULFILDOC c, ORDITEMSTATE d, ORD e
where
( (a.ID = e.ID) and (d.ORDNUM = e.NUM) and
(c.NUM = d.FFDOCNUM) and (c.FFDOCT = 'L' OR c.FFDOCT = 'R')
and (c.INPDATE >= :D1 and c.INPDATE <= :D2 ) )

на БД ~10тиметрвого объема ?
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32345392
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых сам запрос очень тяжёлый (DISTINCT). Во вторых могут быть неправильно построены или использованы индексы и в третих - мог просто мусор из базы удаляться, к апримеру.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32345416
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С индексами вроде всё ок...
База сейчас локальна и зависание повторяется при повторных запусках -
не мусор..
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32345455
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А попробуй выполнить оба эти запроса не через view а напрямую.... И сначала без distinct-а, а потом с distinct-ом. И все время смотри планы запросов...

Кстати, попробуй перед эти провести validation с Record Fragment.Enabled:=True. Небось без Forced write работаешь.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346355
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без создания viewa выполняется нормально..
Кстати, попробуй перед эти провести validation с Record Fragment.Enabled:=True. Небось без Forced write работаешь.
Как (чем) проводится validation и где прописывается forced write ?)
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346368
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
- IBConsole
- регистрируешь локальный сервер
- подключаешься кнему
- регистрируешь свою базу
- правой мышкой по базе, пункт меню Validation

- подключаешся к базе
- правой мышкой по базе, пункт меню Properties, вкладка General, внизу Forced Writes
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346520
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Validation проходит нормально, forced writes был и остается enabled.
Виснуть сейчас перестало, но viewы создает _пустые_ хотя
соответствующие им запросы прекрасно выполняются
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346530
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполняются с нормальным ненулевым результатом.
Просто там для отчета выбираются данные в несколько viewов и потом сливаются в одну табличку.
Курсоры в IB 7.0 я не нашел как заставить работать,
делать все в виде одного запроса будет слишком (монстровая такая структура получится ) ),
viewы выглядят тут наиболее естественно... Но не работают)
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346541
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот нафига View использовать? Есть же ХП!!!



Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346594
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viewы проще и для отчетов их наиболее естественно использовать
Если б работали
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346674
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда.. оказывается внутри viewов нельзя использовать cast() : убрал - заработало
Дурдом...
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346803
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХП - тот же View, только там можно использовать все что угодно и как угодно!

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

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346907
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только надо провильно установить типы для
ID INTEGER, ORGNAME, SERVICEPERCENT

Код: 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.
CREATE PROCEDURE NEW_PROCEDURE (
    D1 DATE,
    D2 DATE)
RETURNS (
    ID INTEGER,
    ORGNAME INTEGER,
    SERVICEPERCENT INTEGER)
AS
BEGIN

  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD b ON (a.ID = b.ID)
  WHERE b.DATEJOIN BETWEEN (:D1 AND :D2) DO BEGIN
    SUSPEND;
  END

  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD e ON (a.ID = e.ID)
  JOIN FULFILDOC c ON (c.NUM = d.FFDOCNUM)
  JOIN ORDITEMSTATE d ON (d.ORDNUM = e.NUM)
  WHERE (c.FFDOCT = 'L' OR c.FFDOCT = 'R') AND c.INPDATE BETWEEN (:D1 AND :D2)
  INTO :ID, :ORGNAME, :SERVICEPERCENT DO BEGIN
    SUSPEND;
  END

END


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32346922
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалять надо чтобы базу не засорять -
отчет это дело клиентского приложения и если требования к нему изменятся,
то хотелось бы при этом изменить только саму программу, и не лезть в базу.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347420
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hyh
Ну тогда удаляй себе на здоровье!

DROP PROCEDURE NEW_PROCEDURE;

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347486
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>этом изменить только саму программу, и не лезть в базу
А "create/drop procedure" это не лазание в базу :)

Еще вы явно нестрадаете предубежденностью в вопросе о модификации метеденных.

Вообще конечно интересный подход с точки зрения оптимизации.
IMHO оправдан только если
(компиляция SP)+(запись в метаданные) дольше чем (построение плана для запроса)
А такое возможно только для очень сложного запроса выполняемого более 1 раза.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347554
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лазание при изменении постановки задачи))
А когда на клиенте в начате работы программки она создается,
в конце удаляется, то для изменения трогается только программа, а не сама база.
К тому же прога в дальнейшем будет работать с несколькими базами,
каждая из которых и так немаленькая и с десятком-другим процедур
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347563
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А про запросы.. Ну сами напросились)

Основной :
select q1.ID, q1.ORGNAME,
q1.SERVICEPERCENT, q2.ZT, q3.CC, qL.LT, qR.RT
from q1
full outer join q2 on (q2.ID = q1.ID)
full outer join q3 on (q3.ID= q1.ID)
full outer join qL on (qL.ID= q1.ID)
full outer join qR on (qR.ID= q1.ID)
order by q1.ID

_____
create view q1
(ID, ORGNAME, SERVICEPERCENT)
as select distinct
a.ID as ID, a.ORGNAME as ORGNAME, a.SERVICEPERCENT as SERVICEPERCENT
from
INTERMED a, ORD b
where ((a.ID = b.ID)
)

UNION

select distinct
a.ID as ID, a.ORGNAME as ORGNAME,
a.SERVICEPERCENT as SERVICEPERCENT
from
INTERMED a, FULFILDOC c, ORDITEMSTATE d, ORD e
where
( (a.ID = e.ID) and (d.ORDNUM = e.NUM) and
(c.NUM = d.FFDOCNUM) and (c.FFDOCT = 'L' OR c.FFDOCT = 'R')
)
_____
create view q2
(ID, ZT)
as select ID, sum(TOTAL) as ZT from ORD
where (DATEJOIN not NULL)
group by ID
_____
create view q3
(ID, CC)
as select ID, count (DISTINCT CLNUM) as CC from ORD
where DATEJOIN not NULL
group by ID
_____
create view qL
(ID, LT)
as select a.ID, sum (b.TOTAL) as LT
from
INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
where
( (a.ID = e.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')
)
group by a.ID
_____
create view qR
(ID, RT)
as select a.ID, sum (b.TOTAL) as RT
from
INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
where
( (a.ID = e.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')
)
group by a.ID
_____

Вызываться основной запрос будет несколько раз подряд (просмотр отчетов за разные периоды)
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347569
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А да, и в конце каждого проверки конечно) по дате

create view q1
(ID, ORGNAME, SERVICEPERCENT)
as select distinct
a.ID, a.ORGNAME, a.SERVICEPERCENT
from
INTERMED a, ORD b
where ((a.ID = b.ID) and
(b.DATEJOIN >= :D1 and b.DATEJOIN <= :D2 ))

UNION

select distinct
a.ID as ID, a.ORGNAME as ORGNAME,
a.SERVICEPERCENT as SERVICEPERCENT
from
INTERMED a, FULFILDOC c, ORDITEMSTATE d, ORD e
where
( (a.ID = e.ID) and (d.ORDNUM = e.NUM) and
(c.NUM = d.FFDOCNUM) and (c.FFDOCT = 'L' OR c.FFDOCT = 'R')
and (c.INPDATE >= :D1 and c.INPDATE <= :D2 ) )

и тп
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347581
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что ? Все это можно сделать в одной процедуре и все будет достаточно быстро работать.

P.S.

Код: 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.
create view qL 
(ID, LT) 
as select a.ID, sum (b.TOTAL) as LT 
from 
INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e 
where 
( (a.ID = e.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') 
) 
group by a.ID 
_____ 
create view qR 
(ID, RT) 
as select a.ID, sum (b.TOTAL) as RT 
from 
INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e 
where 
( (a.ID = e.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') 
) 
group by a.ID 


Это совсем одинаковые запросы !!! Можно использовать параметр процедуры:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select a.ID, sum (b.TOTAL) as RT 
from 
INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e 
where 
( (a.ID = e.ID) and (d.ORDNUM = e.NUM) and 
(b.ITEMNUM = d.ITEMNUM) and 
(b.ORDNUM = d.ORDNUM) and 
(c.NUM = d.FFDOCNUM) and (c.FFDOCT = :PARM)  // :PARM = 'R' или 'L'
group by a.ID 

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347642
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в курсе что почти одинаковые - я так и писал для единообразия)
Про сделать я не сомневаюсь, а вот насчет быстроты..
В написанном виде он вообще виснет с 100% загрузкой...
При замене full outer на left outer минут через 5 отвисает и
выдает "EIBInterBaseError .. 'conversion error from string '' ''' " (2 пробел 3)
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347682
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно организовать ХП и проанализировать планы запросов,
то скорее всего выполнение процедуры будет занимать не больще пары минут.

А сколько примерно записей в таблицах ?

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347714
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
300, 500 - в таком духе; больше 1000 вроде пока нет
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32347764
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вау! Да тут можно и в 1 минуту вписаться без проблем!
Пишите ХП и проблем не будет.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32348375
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.
CREATE PROCEDURE NEW_PROCEDURE (
    D1 DATE,
    D2 DATE)
RETURNS (
    ID INTEGER,
    ORGNAME INTEGER,
    SERVICEPERCENT INTEGER)
AS
BEGIN

  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD b ON (a.ID = b.ID)
  WHERE b.DATEJOIN BETWEEN (:D1 AND :D2) DO BEGIN
    SUSPEND;
  END

  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD e ON (a.ID = e.ID)
  JOIN FULFILDOC c ON (c.NUM = d.FFDOCNUM)
  JOIN ORDITEMSTATE d ON (d.ORDNUM = e.NUM)
  WHERE (c.FFDOCT = 'L' OR c.FFDOCT = 'R') AND c.INPDATE BETWEEN (:D1 AND :D2)
  INTO :ID, :ORGNAME, :SERVICEPERCENT DO BEGIN
    SUSPEND;
  END

END

куда попадает результат первого selecta ?
И можно ли как-нибудь кроме юниона реализовать исключение
повторений в двух частях этого запроса?
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32348381
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение я пропустил INTO :ID, :ORGNAME, :SERVICEPERCENT
НО лучше использовать UNION.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349136
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.
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 ),
    RT NUMERIC( 9 ,  2 )
)
AS
BEGIN
  ZT= 0 ;
  CC= 0 ;
  LT= 0 ;
  RT= 0 ;

  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD b ON (a.ID = b.ID)
  WHERE b.DATEJOIN >=:D1 AND b.DATEJOIN <= :D2 
  UNION
  SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD e ON (a.ID = e.ID)
  JOIN ORDITEMSTATE d ON (d.ORDNUM = e.NUM)
  JOIN FULFILDOC c ON (c.NUM = d.FFDOCNUM)
  WHERE ((c.FFDOCT = 'L' OR c.FFDOCT = 'R') AND 
  (c.INPDATE  >= :D1) AND  (c.INPDATE <= :D2))

INTO :ID, :ORGNAME, :SERVICEPERCENT
  DO BEGIN

  select sum(TOTAL) from ORD  
  where (ID=:ID) and (DATEJOIN >=  :D1) and  (DATEJOIN <= :D2 )
  INTO :ZT ;

  select count (DISTINCT CLNUM) from ORD
  where (ID=:ID) and (DATEJOIN >= :D1) and (DATEJOIN <= :D2)
  INTO :CC ;

  select sum (b.TOTAL) 
  from 
  INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (a.ID=:ID) and (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 
  INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (a.ID=:ID) and (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 ;

   SUSPEND;
  END


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

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349156
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возник вопрос о возможности проверки существования в базе объекта метаданных с таким-то именем.
Перед созданием процедуры хотелось бы проверить ее существование
(она удаляется в конце, но программа может завершится и некорректно..)
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349158
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает вполне нормально - в пределах полуминуты.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349195
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть системная табличка : RDB$RELATIONS , там описаны метаданные

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349272
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какой примерно синтаксис запроса к этой табличке о существовании какого-то объекта?
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349288
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В описанном случае просто хотелось бы сделать проверки перед созданием и удалением процедуры
И както сообщить Дельфям об их результате, чтобы по нему пускать или нет соответствующий IBSQL
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32349341
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT 1 FROM RDB$PROCEDURES WHERE RDB$PROCEDURE_NAME = 'PROC_NAME'

Если вернет 1 - значит есть такая

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32355702
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.
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 ),
    RT NUMERIC( 9 ,  2 )
)
AS
BEGIN
  FOR SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD b ON (a.ID = b.ID)
  WHERE b.DATEJOIN >=:D1 AND b.DATEJOIN <= :D2 
  UNION
  SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD e ON (a.ID = e.ID)
  JOIN ORDITEMSTATE d ON (d.ORDNUM = e.NUM)
  JOIN FULFILDOC c ON (c.NUM = d.FFDOCNUM)
  WHERE ((c.FFDOCT = 'L' OR c.FFDOCT = 'R') AND 
  (c.INPDATE  >= :D1) AND  (c.INPDATE <= :D2))

  INTO :ID, :ORGNAME, :SERVICEPERCENT
  DO BEGIN
 
  ZT= 0 ;
  CC= 0 ;
  LT= 0 ;
  RT= 0 ;
  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 
  INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (a.ID=:ID) and (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 
  INTERMED a, ORDITEM b, FULFILDOC c, ORDITEMSTATE d, ORD e
  where
  ( (a.ID=:ID) and (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 ;

  LT=LT-RT;  

   SUSPEND;
  END


END

Немного мутировавшая, уже упоминавшаяся процедура
теперь изволит работать на 20ти метровых базах, но
виснет на 430метровой с той же структурой..
Причем как при вызове из проги, так и при прямом исполнении
из SQLexplorera и IBExperta ...
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32355759
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что IBExpert выдает в качестве анализа плана ?

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32355937
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PLAN JOIN (E INDEX (XAK1ORD),D INDEX (XPKORDITEMSTATE,XIF217ORDITEMSTATE),B INDEX (XPKORDITEM,XIF85ORDITEM),C INDEX (RDB$PRIMARY46))

JOIN (E INDEX (XAK1ORD),D INDEX (XPKORDITEMSTATE,XIF217ORDITEMSTATE),B INDEX (XPKORDITEM,XIF85ORDITEM),C INDEX (RDB$PRIMARY46))

JOIN (E INDEX (XAK1ORD),D INDEX (XPKORDITEMSTATE),C INDEX (RDB$FOREIGN134,RDB$PRIMARY46),B INDEX (XPKORDITEM,XIF85ORDITEM))

JOIN (E INDEX (XAK1ORD),D INDEX (XPKORDITEMSTATE),C INDEX (RDB$FOREIGN134,RDB$PRIMARY46),B INDEX (XPKORDITEM,XIF85ORDITEM))

SORT (JOIN (A NATURAL,E INDEX (XAK1ORD),D INDEX (XPKORDITEMSTATE,XIF217ORDITEMSTATE,RDB$FOREIGN173,XIF217ORDITEMSTATE,RDB$FOREIGN173,XIF217ORDITEMSTATE,RDB$FOREIGN173),C INDEX (RDB$PRIMARY46)))

Это план select * from rep_ph('1-10-2003','11-10-2003')
Wondering откудова там sort :/
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32355964
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sort убирается после стирания distinct'a но NATURAL при этом остается.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32356570
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мелких базах(20тиметровых) performance editor показывает
~12000 индексированных и 120 неиндексированных запросов для select * from rep_ph('1-10-2003','11-10-2003')
Без distincta и соответственно без sorta на большой базе виснет так же,
natural тоже, видимо, ни при чем : >1% запросов вряд ли сильно замедляют...
Ф чём же может быть проблема?..
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32356732
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что дело может быть в UNION. Сейчас посмотрю что у меня получается на 600 метрах ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32356829
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hyh

Поставь счетчик и по достижению N вызывай Exit !!!

Кстати UNION тут совсем не причем ... Можно попробовать поиграть
с порядком JOIN. Странно, но у меня NATURAL не возникает.

Попробуй посмотреть что получается вот с эти запросом ... заковыка в нем :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD b ON (a.ID = b.ID)
  WHERE b.DATEJOIN >=:D1 AND b.DATEJOIN <= :D2 
  UNION
  SELECT DISTINCT a.ID, a.ORGNAME, a.SERVICEPERCENT
  FROM INTERMED a
  JOIN ORD e ON (a.ID = e.ID)
  JOIN ORDITEMSTATE d ON (d.ORDNUM = e.NUM)
  JOIN FULFILDOC c ON (c.NUM = d.FFDOCNUM)
  WHERE ((c.FFDOCT = 'L' OR c.FFDOCT = 'R') AND 
  (c.INPDATE  >= :D1) AND  (c.INPDATE <= :D2))


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32357893
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопщем я в полных непонятках.. Видимо это баг какой-то :/
Сделал 2 процедуры:
Код: 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.
CREATE PROCEDURE RP0
RETURNS (
    ID CHAR( 2 ),
    IT NUMERIC( 9 ,  2 ),
    cc integer   
    )
AS
declare variable n integer;
BEGIN
n= 0 ;
  FOR 
SELECT DISTINCT O2.ID, SUM(O.TOTAL),
 COUNT(DISTINCT O2.CLNUM)
FROM ORDITEM O, ORDITEMSTATE O1,
 FULFILDOC F, ORD O2
WHERE
(O1.ORDNUM = O.ORDNUM)
 AND (O1.ITEMNUM = O.ITEMNUM)
 AND (O1.FFDOCTYPE = 'A')
 AND (O1.STATECODE IN ('0','1'))
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= '10.10.2003')
 AND (F.INPDATE <= '15.10.2003')
 AND (O2.NUM = O.ORDNUM)
GROUP BY O2.ID
ORDER BY O2.ID,  2 ,  3 
into :ID, :IT, :CC
  do begin
  if (n> 1 ) then exit;
  n=n+ 1 ;
   SUSPEND;
  end
END

vs

CREATE PROCEDURE RP1
RETURNS (
    ID CHAR( 2 ),
    ORGNAME VARCHAR( 80 ),
    SERVICEPERCENT NUMERIC( 9 ,  2 ),
    IT NUMERIC( 9 ,  2 ),
    cc integer   
    )
AS
declare variable n integer;
BEGIN
n= 0 ;
  FOR 
SELECT DISTINCT O2.ID, a.ORGNAME, a.servicepercent, SUM(O.TOTAL),
 COUNT(DISTINCT O2.CLNUM)
FROM ORDITEM O, ORDITEMSTATE O1,
 FULFILDOC F, ORD O2, intermed A
WHERE
(O1.ORDNUM = O.ORDNUM)
 AND (O1.ITEMNUM = O.ITEMNUM)
 AND (O1.FFDOCTYPE = 'A')
 AND (O1.STATECODE IN ('0','1'))
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= '10.10.2003')
 AND (F.INPDATE <= '15.10.2003')
 AND (O2.NUM = O.ORDNUM)
 AND (A.ID = o2.ID)
GROUP BY O2.ID, a.ORGNAME, a.servicepercent
ORDER BY O2.ID,  2 ,  3 ,  4 ,  5 
into :ID, :ORGNAME, :SERVICEPERCENT, :IT, :CC
  do begin
  if (n> 1 ) then exit;
  n=n+ 1 ;
   SUSPEND;
  end
END

0я выполняется ~50 секунд на 430метровой базе и честно выдает 2 записи
1я на той же базе нафик виснет
Причем для таблички INTERMED(которая там по сравнению с остальными очень небольшая)
упорно не желает использовать индексы,
и те которые там есть, и те, что я создавал руками...
Вроде бы ну и ладно - как было написано выше, т.о.
неиндексированными получаются < 1% запросов к базе,
но в чем же тогда то проблема? Вот уже полчаса IBExpert
пытается дождаться выполнения 1й процедуры...
Не создает ли оно там декартово произведение этих табличек если запрос к одной неиндексирован?..
Это как-то неправдоподобно, только вот я еще не придумал, как еще
объяснить такое поведение при выполнении 2х почти идентичных процедур.
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32358013
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.
CREATE PROCEDURE R_P
RETURNS (
    ID CHAR( 2 ),
    ORGNAME VARCHAR( 80 ),
    SERVICEPERCENT NUMERIC( 9 ,  2 ),
    IT NUMERIC( 9 ,  2 ),
    cc integer   
    )
AS
declare variable n integer;
BEGIN
n= 0 ;
  FOR 
SELECT DISTINCT O2.ID, SUM(O.TOTAL),
 COUNT(DISTINCT O2.CLNUM)
FROM ORDITEM O, ORDITEMSTATE O1,
 FULFILDOC F, ORD O2
WHERE
(O1.ORDNUM = O.ORDNUM)
 AND (O1.ITEMNUM = O.ITEMNUM)
 AND (O1.FFDOCTYPE = 'A')
 AND (O1.STATECODE IN ('0','1'))
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= '10.10.2003')
 AND (F.INPDATE <= '15.10.2003')
 AND (O2.NUM = O.ORDNUM)
GROUP BY O2.ID
ORDER BY O2.ID,  2 ,  3 
into :ID, :IT, :CC
  do begin
  select a.orgname, a.servicepercent
  from intermed a
  where a.id = :id
  into :orgname, :servicepercent;
  if (n> 1 ) then exit;
  n=n+ 1 ;
   SUSPEND;
  end
END

А вот это работает так же в пределах 50ти сек и делает то же, что RP1
Бред around :|
...
Рейтинг: 0 / 0
Выполнение очень долгого запроса.
    #32358302
hyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT DISTINCT O2.ID
FROM ORDITEMSTATE O1,
 FULFILDOC F, ORD O2
WHERE
 (O1.FFDOCTYPE = 'A')
 AND (O1.STATECODE IN ('0','1'))
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= :D1)
 AND (F.INPDATE <= :D2)
 AND (O2.NUM = O1.ORDNUM)
 UNION
SELECT DISTINCT O2.ID
FROM ORDITEMSTATE O1,
 FULFILDOC F, ORD O2
WHERE
(O1.FFDOCTYPE IN ('L','R'))
 AND (F.NUM = O1.FFDOCNUM)
 AND (F.INPDATE >= :D1)
 AND (F.INPDATE <= :D2)
 AND (O2.NUM = O1.ORDNUM)

Код: plaintext
1.
PLAN SORT (JOIN (F NATURAL,O1 INDEX (XIF217ORDITEMSTATE,XIF150ORDITEMSTATE),O2 INDEX (RDB$PRIMARY56)))
PLAN SORT (JOIN (O2 NATURAL,O1 INDEX (XPKORDITEMSTATE,XIF217ORDITEMSTATE,RDB$FOREIGN173,XIF217ORDITEMSTATE,RDB$FOREIGN173),F INDEX (RDB$PRIMARY46)))

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


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