Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замедлился запрос / 20 сообщений из 20, страница 1 из 1
05.09.2018, 17:29
    #39698658
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
После вставки подзапроса с inner join
Код: sql
1.
,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c

запрос сильно замедлился. Подскажите можно ли как-то избежать этого?


Код: sql
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.
readQuery.SQL.Add(
'select (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar) as tovar , '+
'       (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv, '+
'       (select first 1 name from sprserii  where ID = ostatok_na_date.idserii) as seriya, '+
'       (select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) as goden_do,'+
'       (select NUMSERT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,'+
'       (select DATAEND from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,'+
'       (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,'+
'       (select DATAOUT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,'+
'        ostatok_na_date.ostatok, '+
'        ostatok_na_date.cena, ostatok_na_date.cenaopt, ostatok_na_date.idserii '+
// 13.03.2017
'  ,ostatok_na_date.idtovar, ostatok_na_date.idproizv, ostatok_na_date.prihod, '+
'  (select first 1 tovar from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as nelik, '+
'  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as not_show' +
    //13.03.2017

    
  //05.09.2018
 {//10.07.2018
 '  ,(select first 1 id_sprtovara from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnatovar, ' +
 '  (select first 1 id_sprproizv from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnaproizv ' +
  //10.07.2018 }

 '  ,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c ' +
   //05.09.2018

//15.06.2018
    ' ,ostatok_na_date.Kod1C as Kod1C ' +
    ' ,ostatok_na_date.Barcode as barcode ' +
    ' ,ostatok_na_date.INN as INN ' +
    ' ,ostatok_na_date.Naklad as Naklad ' +
    ' ,ostatok_na_date.hide as hide ' +
 //15.06.2018


' from ostatok_na_date(:d1)');



З.Ы. firebird 2.5 + fibplus а дельфи
...
Рейтинг: 0 / 0
05.09.2018, 20:22
    #39698738
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010З.Ы. firebird 2.5 + fibplus а дельфиЭто не повод постить в форум по MySQL.

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
05.09.2018, 20:44
    #39698742
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010,

ужас. За такие запросы надо линейкой по пальцам
...
Рейтинг: 0 / 0
05.09.2018, 21:14
    #39698747
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010,

ЧТО ЭТО??? какой-то чудовищный бессмысленный копипаст. Предлагаю сначала убрать все повторы, а потом уже задавать вопрос про "замедлилось".
К слову, при "замедлилось" надо смотреть на план запроса, но в отношении исходного запроса - проще убиться, чем разбирать этот план. Поэтому, запрос сначала надо сократить.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(select NUMSERT from TABLESERT 
 where id_tdoc = (select first 1 ID from ALLTABLEDOC 
                         where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) 
                          and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,
(select DATAEND from TABLESERT 
 where id_tdoc = (select first 1 ID from ALLTABLEDOC 
                         where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) 
                          and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,
(select DEKLARANT from TABLESERT 
 where id_tdoc = (select first 1 ID from ALLTABLEDOC 
                         where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) 
                          and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,



p.s. select (select from (select first 1 - это же застрелиться можно.
...
Рейтинг: 0 / 0
05.09.2018, 21:26
    #39698750
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Такое впечатление, что исходный запрос (как пример, видимо) писал
один разраб, а копипастил без нужной квалификации - другой(ие).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.09.2018, 08:40
    #39698830
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Симонов Денис,
За что конкретно?
...
Рейтинг: 0 / 0
06.09.2018, 08:43
    #39698831
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
kdv, почему бессмысленный? я же говорю, все работало прилично и довольно быстро (3-5 сек) до вставки еще одно подзапроса с inner join - время выросло до 20 сек. Я поэтому и спрашиваю - какие варианты есть кроме кучи подзапросов? Я так понимаю это сделано чтобы не было кучи inner join. Как по другому то сделать?
...
Рейтинг: 0 / 0
06.09.2018, 08:47
    #39698833
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Гаджимурадов Рустам, что не так с копипастой? Скопировал напрямую из Delphi. Или имеешь в виду что не полный текст? Или что дельфяной код в скульные теги взял? Каюсь, очень спешил. Вот так нормально будет смотреться?


Код: pascal
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.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
readQuery.SQL.Clear;

if edtDateDoc_Po.Date <= now() - 90 then
begin
    readQuery.SQL.Add(
'select (select first 1 name from sprtovara where ID = ostatok_na_date_90.idtovar) as tovar , '+
'       (select first 1 name from sprproizv where ID = ostatok_na_date_90.idproizv) as proizv, '+
'       (select first 1 name from sprserii  where ID = ostatok_na_date_90.idserii) as seriya, '+
'       (select first 1 goden_do from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar)) as goden_do,'+
'       (select NUMSERT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar))) as numsert,'+
'       (select DATAEND from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar))) as dataend,'+
'       (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar))) as deklarant,'+
'       (select DATAOUT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar))) as dataout,'+
'        ostatok_na_date_90.ostatok, '+
'        ostatok_na_date_90.cena, ostatok_na_date_90.cenaopt, ostatok_na_date_90.idserii '+
'from ostatok_na_date_90(:d1)');

if chMinus.Checked then
   readQuery.SQL.Add(' where ostatok < 0 ')
else    readQuery.SQL.Add(' where ostatok <> 0 ');

if chGoden_do.Checked then
   begin
    readQuery.SQL.Add(' and ((select first 1 goden_do from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar)) <= :d2 )');
    readQuery.SQL.Add(' and ((select first 1 goden_do from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date_90.idserii) and (ID_SPRPROIZV = ostatok_na_date_90.idproizv) and (ID_SPRTOVARA = ostatok_na_date_90.idtovar)) <> '+ '''30.12.1899'''+' )');
   end;

if ID_tovar <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date_90.idtovar = '+inttostr(ID_tovar)+')'
  );
end;

if ID_Proizv <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date_90.idproizv = '+inttostr(ID_Proizv)+')'
  );
end;

if ID_serii <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date_90.idserii = '+inttostr(ID_serii)+')'
  );

end;

readQuery.SQL.Add(' order by tovar, idserii ');
end
else
begin
  readQuery.SQL.Add(
'select (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar) as tovar , '+
'       (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv, '+
'       (select first 1 name from sprserii  where ID = ostatok_na_date.idserii) as seriya, '+
'       (select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) as goden_do,'+
'       (select NUMSERT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,'+
'       (select DATAEND from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,'+
'       (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,'+
'       (select DATAOUT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,'+
'        ostatok_na_date.ostatok, '+
'        ostatok_na_date.cena, ostatok_na_date.cenaopt, ostatok_na_date.idserii '+
// 13.03.2017
'  ,ostatok_na_date.idtovar, ostatok_na_date.idproizv, ostatok_na_date.prihod, '+
'  (select first 1 tovar from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as nelik, '+
'  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as not_show' +
    //13.03.2017

    
  //05.09.2018
 {//10.07.2018
 '  ,(select first 1 id_sprtovara from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnatovar, ' +
 '  (select first 1 id_sprproizv from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnaproizv ' +
  //10.07.2018 }

 '  ,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c ' +
   //05.09.2018

//15.06.2018
    ' ,ostatok_na_date.Kod1C as Kod1C ' +
    ' ,ostatok_na_date.Barcode as barcode ' +
    ' ,ostatok_na_date.INN as INN ' +
    ' ,ostatok_na_date.Naklad as Naklad ' +
    ' ,ostatok_na_date.hide as hide ' +
 //15.06.2018


' from ostatok_na_date(:d1)');

if chMinus.Checked then
   readQuery.SQL.Add(' where ostatok < 0 ')
else    readQuery.SQL.Add(' where ostatok <> 0 ');

if chGoden_do.Checked then
   begin
    readQuery.SQL.Add(' and ((select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) <= :d2 )');
    readQuery.SQL.Add(' and ((select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) <> '+ '''30.12.1899'''+' )');
   end;

if ID_tovar <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date.idtovar = '+inttostr(ID_tovar)+')'
  );
end;

if ID_Proizv <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date.idproizv = '+inttostr(ID_Proizv)+')'
  );
end;

if ID_serii <> 0 then
begin
  readQuery.SQL.Add(
'     and  (ostatok_na_date.idserii = '+inttostr(ID_serii)+')'
  );

end;


readQuery.SQL.Add(' order by tovar, idserii ');
end;

readQuery.ParamByName('d1').AsString := FormatDateTime('dd.mm.yyyy', edtDateDoc_Po.Date)+' 23.59.59';
if chGoden_do.Checked then
  readQuery.ParamByName('d2').AsString := FormatDateTime('dd.mm.yyyy', edtDateDoc_Po.Date + 180);





...
Рейтинг: 0 / 0
06.09.2018, 08:52
    #39698836
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
В общем главный вопрос такой - что делать то, если нужен еще один подзапрос и именно из 2 таблиц? Желательно баз глобального переписывания запроса - вот в чем загвоздка
...
Рейтинг: 0 / 0
06.09.2018, 09:32
    #39698848
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010В общем главный вопрос такой - что делать то, если нужен еще один подзапрос и именно из 2 таблиц? Желательно баз глобального переписывания запроса - вот в чем загвоздка

Ну раз "без глобального переписывания запроса" то размышлять над
Код: sql
1.
select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)
...
Рейтинг: 0 / 0
06.09.2018, 09:52
    #39698858
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
m7m, вот и думаю, может кто подскажет - есть варианты обойтись как-то без inner join в этом конкретном подзапросе и соответственно не менять весь запрос целиком или все же придется изменять весь запрос? В принципе есть выход - слить таблицы tableasna и asnakods в одну. Точнее, расширить asnakods, чтобы вся нужная инфа была там и динамически ее обновлять в момент обновления tableasna, так как asnakods и tableasna взаимосвязаны и изменяются время от времени независимо друг от друга, поэтому избавиться от одной из низ не получится. Тогда подзапрос будет идти к одной таблице и inner join не понадобится. Так наверно и сделаю, всем спасибо за внимание
...
Рейтинг: 0 / 0
06.09.2018, 09:56
    #39698859
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010,

за то что запрос написан без попыток включить головной мозг, и даже если эффективен, то как минимум трудно читаем.

Массовое применение first 1 настораживает. Там где ты присоединяешь подзапрос по ID, например

Код: sql
1.
(select first 1 name from sprtovara where ID = ostatok_na_date.idtovar) as tovar ,



если ID это первичный ключ, то first 1 на фиг не упал. Во вторых, sprtovara можно явно спустить в секцию FROM основного запроса присоединив её по LEFT JOIN.

Там где подзапросы сделаны не по ID фраза first 1 всё равно напрягает. Т.е. получается что потенциально твои подзапросы могут вернуть более 1 записи, и ты берёшь из них первую попавшуюся. Как то странно это. Обычно first/rows имеют смысл вместе с ORDER BY, там хоть результат предсказуем, да и есть парочку задач где это эффективно работает.

4 раза написать почти одинаковый подзапрос отличающийся только именем извлекаемого поля это конечно сильно.
...
Рейтинг: 0 / 0
06.09.2018, 10:07
    #39698865
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Симонов Денис,
Ок, спасибо за конструктив, над этим уже можно серьезно подумать
...
Рейтинг: 0 / 0
06.09.2018, 10:15
    #39698870
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010,

да просто надо всю эту собранную портянку перетащить в IBE и постепенно переписывать запрос, пока он не упроститься максимально. Если потом останется что-то медленное, то медитировать над этим в любом случае будет проще.
...
Рейтинг: 0 / 0
06.09.2018, 13:05
    #39698974
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Да... я бы подумал о процедуре, или execute block или хотя бы with query as

Код: plsql
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.
-- попытка причесать, не более того
-- да и как я понял, запрос собирается динамически, по крайней мере в части where

select 
  (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar ) as tovar ,
  (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv,
  (select first 1 name from sprserii  where ID = ostatok_na_date.idserii ) as seriya,

  (select first 1 goden_do from TABLEDOC where (ID_SPRSERII  = ostatok_na_date.idserii ) 
                                           and (ID_SPRPROIZV = ostatok_na_date.idproizv) 
										   and (ID_SPRTOVARA = ostatok_na_date.idtovar )) as goden_do,

  (select NUMSERT   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,
  (select DATAEND   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,
  (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,
  (select DATAOUT   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,

  ostatok_na_date.ostatok,
  ostatok_na_date.cena, 
  ostatok_na_date.cenaopt, 
  ostatok_na_date.idserii,

  // 13.03.2017
  ostatok_na_date.idtovar,
  ostatok_na_date.idproizv,
  ostatok_na_date.prihod,

  (select first 1 tovar    from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii ) 
                                                  and (tn.proizv = ostatok_na_date.idproizv)
                                                  and (tn.tovar  = ostatok_na_date.idtovar ) 
											      and (tn.cena   = ostatok_na_date.cena    ))) as nelik,

  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii ) 
                                                  and (tn.proizv = ostatok_na_date.idproizv)
                                                  and (tn.tovar  = ostatok_na_date.idtovar ) 
												  and (tn.cena   = ostatok_na_date.cena    ))) as not_show
  //13.03.2017

    
  //05.09.2018
 
  //10.07.2018
  (select first 1  id_sprtovara   from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv) and (ta.id_sprtovara = ostatok_na_date.idtovar )) as asnatovar , 
  (select first 1  id_sprproizv   from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv) and (ta.id_sprtovara = ostatok_na_date.idtovar )) as asnaproizv, 
  //10.07.2018

  (select first 1  asnakods.kod1c from tableasna as ta 
                                    inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)                         ) as asnakod1c ,

  //05.09.2018

  //15.06.2018
  ostatok_na_date.Kod1C   as Kod1C,
  ostatok_na_date.Barcode as barcode,
  ostatok_na_date.INN     as INN,
  ostatok_na_date.Naklad  as Naklad,
  ostatok_na_date.hide    as hide
  //15.06.2018


from ostatok_na_date(:d1)


...
Рейтинг: 0 / 0
06.09.2018, 13:10
    #39698980
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Еще попытка

Код: plsql
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.
select 
  (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar ) as tovar ,
  (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv,
  (select first 1 name from sprserii  where ID = ostatok_na_date.idserii ) as seriya,

  (select first 1 goden_do from TABLEDOC where (ID_SPRSERII  = ostatok_na_date.idserii ) 
                                           and (ID_SPRPROIZV = ostatok_na_date.idproizv) 
                                           and (ID_SPRTOVARA = ostatok_na_date.idtovar )) as goden_do,

  (select NUMSERT   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,
  (select DATAEND   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,
  (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,
  (select DATAOUT   from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,

  ostatok_na_date.ostatok,
  ostatok_na_date.cena, 
  ostatok_na_date.cenaopt, 
  ostatok_na_date.idserii,

  -- 13.03.2017
  ostatok_na_date.idtovar,
  ostatok_na_date.idproizv,
  ostatok_na_date.prihod,

  (select first 1 tovar    from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii ) 
                                                  and (tn.proizv = ostatok_na_date.idproizv)
                                                  and (tn.tovar  = ostatok_na_date.idtovar ) 
                                                  and (tn.cena   = ostatok_na_date.cena    ))) as nelik,

  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii ) 
                                                  and (tn.proizv = ostatok_na_date.idproizv)
                                                  and (tn.tovar  = ostatok_na_date.idtovar ) 
                                                  and (tn.cena   = ostatok_na_date.cena    ))) as not_show
  --13.03.2017

    
  --05.09.2018
 
  --10.07.2018
  (select first 1  id_sprtovara   from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv) and (ta.id_sprtovara = ostatok_na_date.idtovar )) as asnatovar , 
  (select first 1  id_sprproizv   from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv) and (ta.id_sprtovara = ostatok_na_date.idtovar )) as asnaproizv, 
  --10.07.2018

  (select first 1  asnakods.kod1c from tableasna as ta 
                                    inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)                         ) as asnakod1c ,

  --05.09.2018

  --15.06.2018
  ostatok_na_date.Kod1C   as Kod1C,
  ostatok_na_date.Barcode as barcode,
  ostatok_na_date.INN     as INN,
  ostatok_na_date.Naklad  as Naklad,
  ostatok_na_date.hide    as hide
  --15.06.2018


from ostatok_na_date(:d1)


...
Рейтинг: 0 / 0
06.09.2018, 13:17
    #39698985
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
fraks,

это всё боязнь джойнов с процедурой.
Но на мой взгляд, в исходной задаче криво - зачем сверху суб-селектами навешивать к выборке из процедуры такое количество дополнительных данных из разных таблиц? Может, пора процедуру переписать, или написать еще одну?
...
Рейтинг: 0 / 0
06.09.2018, 13:26
    #39698997
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
kdv,

+ не знание современных возможностей SQL Firebird, в частности CTE
+ не понимание реляционный алгебры. Я уже сказал по поводу first 1 и выборке по ID
...
Рейтинг: 0 / 0
06.09.2018, 14:21
    #39699059
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
Ок, всем спасибо, попробую улучшить. Запросы все был написаны до меня, много лет назад. Я лишь пытаюсь их модифицировать малой кровью так как и без этого туева хуча задач
...
Рейтинг: 0 / 0
07.09.2018, 15:10
    #39699699
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Замедлился запрос
арт2010После вставки подзапроса с inner join
Код: sql
1.
,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c

запрос сильно замедлился. Подскажите можно ли как-то избежать этого?


Код: sql
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.
readQuery.SQL.Add(
'select (select first 1 name from sprtovara where ID = ostatok_na_date.idtovar) as tovar , '+
'       (select first 1 name from sprproizv where ID = ostatok_na_date.idproizv) as proizv, '+
'       (select first 1 name from sprserii  where ID = ostatok_na_date.idserii) as seriya, '+
'       (select first 1 goden_do from TABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar)) as goden_do,'+
'       (select NUMSERT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as numsert,'+
'       (select DATAEND from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataend,'+
'       (select DEKLARANT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as deklarant,'+
'       (select DATAOUT from TABLESERT where id_tdoc = (select first 1 ID from ALLTABLEDOC where (ID_SPRSERII = ostatok_na_date.idserii) and (ID_SPRPROIZV = ostatok_na_date.idproizv) and (ID_SPRTOVARA = ostatok_na_date.idtovar))) as dataout,'+
'        ostatok_na_date.ostatok, '+
'        ostatok_na_date.cena, ostatok_na_date.cenaopt, ostatok_na_date.idserii '+
// 13.03.2017
'  ,ostatok_na_date.idtovar, ostatok_na_date.idproizv, ostatok_na_date.prihod, '+
'  (select first 1 tovar from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as nelik, '+
'  (select first 1 not_show from tnelikvid as tn where ((tn.serii = ostatok_na_date.idserii) and (tn.proizv = ostatok_na_date.idproizv)' +
'   and (tn.tovar = ostatok_na_date.idtovar) and (tn.cena = ostatok_na_date.cena))) as not_show' +
    //13.03.2017

    
  //05.09.2018
 {//10.07.2018
 '  ,(select first 1 id_sprtovara from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnatovar, ' +
 '  (select first 1 id_sprproizv from tableasna as ta where (ta.id_sprproizv = ostatok_na_date.idproizv)' +
 '   and (ta.id_sprtovara = ostatok_na_date.idtovar)) as asnaproizv ' +
  //10.07.2018 }

 '  ,(select first 1 asnakods.kod1c from tableasna as ta inner join asnakods on (ta.kodasna = asnakods.kodasna) and (ta.kod1c = ostatok_na_date.kod1c)) as asnakod1c ' +
   //05.09.2018

//15.06.2018
    ' ,ostatok_na_date.Kod1C as Kod1C ' +
    ' ,ostatok_na_date.Barcode as barcode ' +
    ' ,ostatok_na_date.INN as INN ' +
    ' ,ostatok_na_date.Naklad as Naklad ' +
    ' ,ostatok_na_date.hide as hide ' +
 //15.06.2018


' from ostatok_na_date(:d1)');



З.Ы. firebird 2.5 + fibplus а дельфи

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


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