powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Долго выполняется запрос
23 сообщений из 23, страница 1 из 1
Долго выполняется запрос
    #38645880
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть запрос. Если брать подзапросы(не таблицы а процедуры) в нём, то они выполняются вроде недолго, а сам запрос выполняется долго, как можно его ускорить?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select * from
(
select v5, sum((case when v13 is null then 0 else v13 end)+(case when v15 is null then 0 else v15 end)) v15, sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_OTRRUNPEREOZ
   group by v5,v1,v2,NUMSUBSHET
)t1 where
 t1.v5 in
 ( select distinct t.v5 from
   (
 select v5,  sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_DOHODRUNCEN
  group by v5,v1,v2,NUMSUBSHET
  ) t  where t.v16=0
 )
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645888
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... where
t1.v5 in
( select distinct ...

А если переписать сию страшную конструкцию на джойн?

Как по мне так весь запрос надо в утиль и писать заново. DDL приложи, глядишь кто и подскажет.
ЧИТАТЬ__ВСЕМ,__КТО__ПРИШЕЛ__СЮДА__В__ПЕРВЫЙ__РАЗ!
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645893
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И какой тогда правильный будет запрос? Если можно на данном конкретном примере запроса.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645895
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901, для конкретного примера нужны конкретные данные
Ivan_PisarevskyКак по мне так весь запрос надо в утиль и писать заново. DDL приложи, глядишь кто и подскажет.
ЧИТАТЬ__ВСЕМ,__КТО__ПРИШЕЛ__СЮДА__В__ПЕРВЫЙ__РАЗ!
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645898
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть вам нужны dll, что ли? А что это такое? Как в IBexperte это достать?
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645906
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаю, по ссылке сложно сходить... Цитирую:

авторЕсли у Вас возникли проблемы с написанием некого запроса (сложные группировки, связи нескольких таблиц и т.п.),то крайне желательна следующая формулировка вопроса:
1. Точная версия сервера.
2. Словесное описание проблемы.
3. DDL всех участвующих в запросе объектов БД в виде скрипта.
4. Немного данных, опять таки в виде скрипта, достаточных чтобы понять логику работы.
5. Ваши попытки.
6. Желаемый результат в виде таблички.
Если пункты 3-6 получаются объемными, то используем тэг spoiler. Если для понимая сути проблемы требуется достаточно большой набор исходных данных, скрипт можно сархивировать и приложить как аттач к сообщению.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645907
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор3. DDL всех участвующих в запросе объектов БД в виде скрипта.
Опять ссылка... DDL - описание объектов, участвующих в запросе: view, table, trigger, stored procedure, etc.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645908
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645926
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901Добрый день.

Есть запрос. Если брать подзапросы(не таблицы а процедуры) в нём, то они выполняются вроде недолго, а сам запрос выполняется долго, как можно его ускорить?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select * from
(
select v5, sum((case when v13 is null then 0 else v13 end)+(case when v15 is null then 0 else v15 end)) v15, sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_OTRRUNPEREOZ
   group by v5,v1,v2,NUMSUBSHET
)t1 where
 t1.v5 in
 ( select distinct t.v5 from
   (
 select v5,  sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_DOHODRUNCEN
  group by v5,v1,v2,NUMSUBSHET
  ) t  where t.v16=0
 )


Долго смотрел, процедур не увидел :(
Мне вот интересно в таблице PR_DOHODRUNCEN поля V14,V16 могут иметь отрицательные значения???
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645936
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неасилил. Вот мне интересно человек не разобрался с JOIN, зато фигачит подзапросы Devired tables и ещё куча всего, неужели это проще?

1. вот эти выражения
Код: sql
1.
case when v14 is null then 0 else v14 end


можно переписать проще
Код: sql
1.
COALESCE(v14, 0)


2. в IBE есть такая замечательная штука как форматирование SQL, если уж сам форматировать не можешь
3. DLL находится на специальной вкладке IBE, которая так и называется DLL или скрипт (если русифицирован)
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645938
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

я думаю вот этот префикс PR_ обозначает процедуру, поскольку по наименованиям автора видно, что он не переводит объекты на английский, а делает транслитерацию
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645950
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениснеасилил. Вот мне интересно человек не разобрался с JOIN, зато фигачит подзапросы Devired tables и ещё куча всего, неужели это проще?

1. вот эти выражения
Код: sql
1.
case when v14 is null then 0 else v14 end


можно переписать проще
Код: sql
1.
COALESCE(v14, 0)



Там если присмотреться, то CASE надо вытащить наружу, ибо толку от них внутри SUM никакого
"неужели это проще?" - если есть задание то написать проще, ибо как написано в задании так один к одному и пишется запрос не задумываясь ни о чем, ну мне так кажется
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645957
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вам скрипты объектов были нужны. Ну там много всего используется причём PR_OTRRUNPEREOZ,PR_DOHODRUNCEN это процедуры (я об этом писал) непростые.
Ну вроде нашёл так быстрее
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select p1.v5, sum((case when p1.v13 is null then 0 else p1.v13 end)+(case when p1.v15 is null then 0 else p1.v15 end)) v15, sum((case when p1.v14 is null then 0 else p1.v14 end)+
(case when p1.v16 is null then 0 else p1.v16 end)) v16,p1.v1,p1.v2,p1.NUMSUBSHET
 from PR_OTRRUNPEREOZ p1,
 ( select distinct t.v5 from
   (
 select v5,  sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_DOHODRUNCEN
  group by v5,v1,v2,NUMSUBSHET
  ) t  where t.v16=0)
  p2
  where p1.v5=p2.v5
   group by p1.v5,p1.v1,p1.v2,p1.NUMSUBSHET


да можно ещё вставить COALESCE(v14, 0) ещё чуть быстрее будет.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645959
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисm7m,
я думаю вот этот префикс PR_ обозначает процедуру, поскольку по наименованиям автора видно, что он не переводит объекты на английский, а делает транслитерацию
Ну если это процедуры, тогда ой.
я по простоте душевной решил что это таблицы
значит будем ждать текста процедур
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645972
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901А вам скрипты объектов были нужны. Ну там много всего используется причём PR_OTRRUNPEREOZ,PR_DOHODRUNCEN это процедуры (я об этом писал) непростые.
Ну вроде нашёл так быстрее
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select p1.v5, sum((case when p1.v13 is null then 0 else p1.v13 end)+(case when p1.v15 is null then 0 else p1.v15 end)) v15, sum((case when p1.v14 is null then 0 else p1.v14 end)+
(case when p1.v16 is null then 0 else p1.v16 end)) v16,p1.v1,p1.v2,p1.NUMSUBSHET
 from PR_OTRRUNPEREOZ p1,
 ( select distinct t.v5 from
   (
 select v5,  sum((case when v14 is null then 0 else v14 end)+
(case when v16 is null then 0 else v16 end)) v16,v1,v2,NUMSUBSHET
 from PR_DOHODRUNCEN
  group by v5,v1,v2,NUMSUBSHET
  ) t  where t.v16=0)
  p2
  where p1.v5=p2.v5
   group by p1.v5,p1.v1,p1.v2,p1.NUMSUBSHET


да можно ещё вставить COALESCE(v14, 0) ещё чуть быстрее будет.

от COALESCE быстрее не будет, но зато будет короче. Переписал твой запрос с использованием CTE, так он более понятен. Логику не переделывал, теперь когда он понятней можно и над оптимизацией подумать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH P2
AS (SELECT DISTINCT
        T.V5
    FROM (SELECT
              V5,
              SUM(COALESCE(V14, 0) + COALESCE(V16, 0)) AS V16,
              V1,
              V2,
              NUMSUBSHET
          FROM PR_DOHODRUNCEN
          GROUP BY V5, V1, V2, NUMSUBSHET) T
    WHERE T.V16 = 0)
SELECT
    P1.V5,
    SUM(COALESCE(P1.V13, 0) + COALESCE(P1.V15, 0)) AS V15,
    SUM(COALESCE(P1.V14, 0) + COALESCE(P1.V16, 0)) AS V16,
    P1.V1,
    P1.V2,
    P1.NUMSUBSHET
FROM PR_OTRRUNPEREOZ P1
JOIN P2 ON P1.V5 = P2.V5
GROUP BY P1.V5, P1.V1, P1.V2, P1.NUMSUBSHET
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645981
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да спасибо только with в запросе не идёт у меня FB 2.1.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38645989
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 2.1 with прекрасно работает. В запросе могла быть ошибка, т.к. я его не проверял
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38646046
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда почему тогда пишет
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
WITH.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38646060
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901,

точную версию скажи (все циферки). А то мне кажется, что ты даже не знаешь с какой версией работаешь
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38646813
anpl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Union в помощь! :)
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38647275
r901
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Да у меня версия FB2.0.3. Ну вроде мой запрос пока нормально отрабатывает(не долго), поэтому пока скрипты не размешаю, да и много предёться размещать, там и процедуры и много таблиц задействовано в них, да и сами процедуры немаленькие.
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38647351
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901пока скрипты не размешаю, да и много предёться размещать, там и процедуры и
много таблиц задействовано в них, да и сами процедуры немаленькие.
Тогда халявы не будет. Иди и сам изучай http://ibase.ru/develop.htm#performance
Тщательно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Долго выполняется запрос
    #38647387
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r901,

вот этот запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT DISTINCT
        T.V5
    FROM (SELECT
              V5,
              SUM(COALESCE(V14, 0) + COALESCE(V16, 0)) AS V16,
              V1,
              V2,
              NUMSUBSHET
          FROM PR_DOHODRUNCEN
          GROUP BY V5, V1, V2, NUMSUBSHET) T
    WHERE T.V16 = 0



можно упростить до

Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT
    V5
FROM PR_DOHODRUNCEN
GROUP BY V5, V1, V2, NUMSUBSHET
HAVING SUM(COALESCE(V14, 0) + COALESCE(V16, 0)) = 0  



тогда в итоге получаем

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
    P1.V5,
    P1.V1,
    P1.V2,
    P1.NUMSUBSHET,
    SUM(COALESCE(P1.V13, 0) + COALESCE(P1.V15, 0)) AS V15,
    SUM(COALESCE(P1.V14, 0) + COALESCE(P1.V16, 0)) AS V16
FROM PR_OTRRUNPEREOZ P1
JOIN (SELECT DISTINCT
         V5
      FROM PR_DOHODRUNCEN
      GROUP BY V5, V1, V2, NUMSUBSHET
      HAVING SUM(COALESCE(V14, 0) + COALESCE(V16, 0)) = 0) P2 ON P1.V5 = P2.V5
GROUP BY P1.V5, P1.V1, P1.V2, P1.NUMSUBSHET 



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


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