Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Долго выполняется запрос / 23 сообщений из 23, страница 1 из 1
20.05.2014, 08:45:55
    #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
20.05.2014, 08:56:53
    #38645888
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
... where
t1.v5 in
( select distinct ...

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

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

авторЕсли у Вас возникли проблемы с написанием некого запроса (сложные группировки, связи нескольких таблиц и т.п.),то крайне желательна следующая формулировка вопроса:
1. Точная версия сервера.
2. Словесное описание проблемы.
3. DDL всех участвующих в запросе объектов БД в виде скрипта.
4. Немного данных, опять таки в виде скрипта, достаточных чтобы понять логику работы.
5. Ваши попытки.
6. Желаемый результат в виде таблички.
Если пункты 3-6 получаются объемными, то используем тэг spoiler. Если для понимая сути проблемы требуется достаточно большой набор исходных данных, скрипт можно сархивировать и приложить как аттач к сообщению.
...
Рейтинг: 0 / 0
20.05.2014, 09:19:09
    #38645907
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
автор3. DDL всех участвующих в запросе объектов БД в виде скрипта.
Опять ссылка... DDL - описание объектов, участвующих в запросе: view, table, trigger, stored procedure, etc.
...
Рейтинг: 0 / 0
20.05.2014, 09:20:34
    #38645908
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
...
Рейтинг: 0 / 0
20.05.2014, 09:33:50
    #38645926
m7m
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
20.05.2014, 09:42:34
    #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
20.05.2014, 09:44:11
    #38645938
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
m7m,

я думаю вот этот префикс PR_ обозначает процедуру, поскольку по наименованиям автора видно, что он не переводит объекты на английский, а делает транслитерацию
...
Рейтинг: 0 / 0
20.05.2014, 09:52:42
    #38645950
m7m
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
20.05.2014, 09:55:54
    #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
20.05.2014, 09:58:04
    #38645959
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Симонов Денисm7m,
я думаю вот этот префикс PR_ обозначает процедуру, поскольку по наименованиям автора видно, что он не переводит объекты на английский, а делает транслитерацию
Ну если это процедуры, тогда ой.
я по простоте душевной решил что это таблицы
значит будем ждать текста процедур
...
Рейтинг: 0 / 0
20.05.2014, 10:12:02
    #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
20.05.2014, 10:20:10
    #38645981
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Да спасибо только with в запросе не идёт у меня FB 2.1.
...
Рейтинг: 0 / 0
20.05.2014, 10:22:46
    #38645989
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
в 2.1 with прекрасно работает. В запросе могла быть ошибка, т.к. я его не проверял
...
Рейтинг: 0 / 0
20.05.2014, 10:58:39
    #38646046
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Тогда почему тогда пишет
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
WITH.
...
Рейтинг: 0 / 0
20.05.2014, 11:06:41
    #38646060
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
r901,

точную версию скажи (все циферки). А то мне кажется, что ты даже не знаешь с какой версией работаешь
...
Рейтинг: 0 / 0
20.05.2014, 17:40:01
    #38646813
anpl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Union в помощь! :)
...
Рейтинг: 0 / 0
21.05.2014, 10:29:11
    #38647275
r901
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
Спасибо. Да у меня версия FB2.0.3. Ну вроде мой запрос пока нормально отрабатывает(не долго), поэтому пока скрипты не размешаю, да и много предёться размещать, там и процедуры и много таблиц задействовано в них, да и сами процедуры немаленькие.
...
Рейтинг: 0 / 0
21.05.2014, 11:30:41
    #38647351
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго выполняется запрос
r901пока скрипты не размешаю, да и много предёться размещать, там и процедуры и
много таблиц задействовано в них, да и сами процедуры немаленькие.
Тогда халявы не будет. Иди и сам изучай http://ibase.ru/develop.htm#performance
Тщательно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.05.2014, 11:50:58
    #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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Долго выполняется запрос / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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