powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замедлился запрос
20 сообщений из 20, страница 1 из 1
Замедлился запрос
    #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
Замедлился запрос
    #39698738
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010З.Ы. firebird 2.5 + fibplus а дельфиЭто не повод постить в форум по MySQL.

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

ужас. За такие запросы надо линейкой по пальцам
...
Рейтинг: 0 / 0
Замедлился запрос
    #39698747
Фотография 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
Замедлился запрос
    #39698750
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое впечатление, что исходный запрос (как пример, видимо) писал
один разраб, а копипастил без нужной квалификации - другой(ие).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Замедлился запрос
    #39698830
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
За что конкретно?
...
Рейтинг: 0 / 0
Замедлился запрос
    #39698831
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, почему бессмысленный? я же говорю, все работало прилично и довольно быстро (3-5 сек) до вставки еще одно подзапроса с inner join - время выросло до 20 сек. Я поэтому и спрашиваю - какие варианты есть кроме кучи подзапросов? Я так понимаю это сделано чтобы не было кучи inner join. Как по другому то сделать?
...
Рейтинг: 0 / 0
Замедлился запрос
    #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
Замедлился запрос
    #39698836
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем главный вопрос такой - что делать то, если нужен еще один подзапрос и именно из 2 таблиц? Желательно баз глобального переписывания запроса - вот в чем загвоздка
...
Рейтинг: 0 / 0
Замедлился запрос
    #39698848
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
Замедлился запрос
    #39698858
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m, вот и думаю, может кто подскажет - есть варианты обойтись как-то без inner join в этом конкретном подзапросе и соответственно не менять весь запрос целиком или все же придется изменять весь запрос? В принципе есть выход - слить таблицы tableasna и asnakods в одну. Точнее, расширить asnakods, чтобы вся нужная инфа была там и динамически ее обновлять в момент обновления tableasna, так как asnakods и tableasna взаимосвязаны и изменяются время от времени независимо друг от друга, поэтому избавиться от одной из низ не получится. Тогда подзапрос будет идти к одной таблице и inner join не понадобится. Так наверно и сделаю, всем спасибо за внимание
...
Рейтинг: 0 / 0
Замедлился запрос
    #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
Замедлился запрос
    #39698865
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
Ок, спасибо за конструктив, над этим уже можно серьезно подумать
...
Рейтинг: 0 / 0
Замедлился запрос
    #39698870
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

да просто надо всю эту собранную портянку перетащить в IBE и постепенно переписывать запрос, пока он не упроститься максимально. Если потом останется что-то медленное, то медитировать над этим в любом случае будет проще.
...
Рейтинг: 0 / 0
Замедлился запрос
    #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
Замедлился запрос
    #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
Замедлился запрос
    #39698985
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

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

+ не знание современных возможностей SQL Firebird, в частности CTE
+ не понимание реляционный алгебры. Я уже сказал по поводу first 1 и выборке по ID
...
Рейтинг: 0 / 0
Замедлился запрос
    #39699059
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, всем спасибо, попробую улучшить. Запросы все был написаны до меня, много лет назад. Я лишь пытаюсь их модифицировать малой кровью так как и без этого туева хуча задач
...
Рейтинг: 0 / 0
Замедлился запрос
    #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
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Замедлился запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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