powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Медленный отчет
12 сообщений из 12, страница 1 из 1
Медленный отчет
    #35997207
lioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть DW, в котором такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select dh.gek,dh.street,dh.no_house,a.no_flat,a.no_account,a.total_area,a.q_living,
(select sum from sld where dirhouse=a.dirhouse and no_account=a.no_account and months(period)=months('2009.05.01')- 1  and sum> 0 ) vhoddeb,
(select sum from sld where dirhouse=a.dirhouse and no_account=a.no_account and months(period)=months('2009.05.01')- 1  and sum< 0 ) vhodkr,
(select sum(sum) from doc d,account ain where account=ain.id and ain.dirhouse=a.dirhouse and ain.no_account=a.no_account and months(d.period)=months('2009.05.01') and in_out= 1 ) sumnach,
(select sum(sum) from doc d,account ain where account=ain.id and ain.dirhouse=a.dirhouse and ain.no_account=a.no_account and months(d.period)=months('2009.05.01') and in_out=- 1 ) sumopl,
(select sum from sld where dirhouse=a.dirhouse and no_account=a.no_account and months(period)=months('2009.05.01') and sum> 0 ) ishoddeb,
(select sum from sld where dirhouse=a.dirhouse and no_account=a.no_account and months(period)=months('2009.05.01') and sum< 0 ) ishodkr
from account a,dirhouse dh
where a.dirhouse=dh.id and a.copy is null
order by dh.gek,a.no_account
В ДВ есть группа по полю dh.gek - вычисляемые поля для полей vhoddeb,vhodkr,sumnach,sumopl,ishoddeb,ishodkr. И такие же вычисляемые поля в банде суммари.
Отчет выполняется почти 5 минут... Как можно ускорить работу отчета? Зараннее спасибо за советы.
...
Рейтинг: 0 / 0
Медленный отчет
    #35997228
Отказаться от вложенных запросов, использовать join-ы и group by.
...
Рейтинг: 0 / 0
Медленный отчет
    #35997259
lioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КолопроктологОтказаться от вложенных запросов, использовать join-ы и group by.
Отношения таблиц не позволяют отказаться от вложенных запросов.
Связи таблиц:
account.id = doc.account
account.dirhouse = sld.dirhouse and account.no_account = sld.no_account
dirhouse.id = account.dirhouse

account - таблица лицевых счетов
doc - таблица начислений, перерасчетов и оплат
sld - таблица сальдо
dirhouse - таблица домов
...
Рейтинг: 0 / 0
Медленный отчет
    #35997304
lionerКолопроктологОтказаться от вложенных запросов, использовать join-ы и group by.
Отношения таблиц не позволяют отказаться от вложенных запросов.
Связи таблиц:
account.id = doc.account
account.dirhouse = sld.dirhouse and account.no_account = sld.no_account
dirhouse.id = account.dirhouse

account - таблица лицевых счетов
doc - таблица начислений, перерасчетов и оплат
sld - таблица сальдо
dirhouse - таблица домов
Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы.
...
Рейтинг: 0 / 0
Медленный отчет
    #35997329
lioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Колопроктолог
Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы.
Да, действительно ДВ на основе хранимой процедуры, выдающей селект из временной таблицы в которую до этого в курсоре заносятся вложенные запросы исходного запроса работает немного быстрее: чуть меньше 4-х минут.
...
Рейтинг: 0 / 0
Медленный отчет
    #35997357
sPaul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lionerКолопроктолог
Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы.
Да, действительно ДВ на основе хранимой процедуры, выдающей селект из временной таблицы в которую до этого в курсоре заносятся вложенные запросы исходного запроса работает немного быстрее: чуть меньше 4-х минут.Сарказм? В любом случае, пишите скрипт хранимки.
Вам уже ответили: вложенные запросы - "узкое место".
...
Рейтинг: 0 / 0
Медленный отчет
    #35997777
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько из 5 минут занимает время выполнения запроса?
Подзапросы типа >0 <0 =1 =-1 можно из 2-х свернуть в 1, если об этом не догадывается оптимизатор например...
...
Рейтинг: 0 / 0
Медленный отчет
    #35997958
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Условия вида months(period)=months('2009.05.01') заменить на
period >= '2009.05.01' and period < '2009.06.01' (если конечно СУБД это автоматом не делает)
Это позволит использовать индекс по period если он есть.

2) Создать индекс по sld (period, dirhouse, no_account) и doc(period, account). Имеет смысл при выполнении п.1

3) Настойчиво рекомендую "Отказаться от вложенных запросов, использовать join-ы и group by."
Для этого нужно выделить три подзапроса (есть 3 варианта join+filter) соединить их по "union all", а во внешнем запросе group by + sum()
Каждый из этих подзапросов возвращает данные в своих столбцах, а в остальных ставит 0.
При этом дебет и кредит считается в одном запросе примерно так:
select ...
when case sum>0 then sum else 0 end as deb,
when case sum<0 then sum else 0 end as cred,

4) Оптимизировать п.3 - вычислять входящее и исходящее сальдо в одно подзапросе.
Для этого расширить фильтр по дате до двух месяцев, а проверку месяца перенести в when case ...end и разнести по четырем столбцам(деб/кре * вх/исх)

ЗЫ. И напоследок: а PowerBuilder тут причем? :)
...
Рейтинг: 0 / 0
Медленный отчет
    #35998176
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что за база то?
Для Sybase ASE, MS SQL, Oracle - решения совершенно разные
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
...
Рейтинг: 0 / 0
Медленный отчет
    #35998507
Igor Domnith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/В ДВ есть группа по полю dh.gek - вычисляемые поля для полей vhoddeb,vhodkr,sumnach,sumopl,ishoddeb,ishodkr. И такие же вычисляемые поля в банде суммари.
Отчет выполняется почти 5 минут... Как можно ускорить работу отчета? Зараннее спасибо за советы.

Вы не пытались определить, что выполняется долго?
- cам запрос
- формирование DW
Попробуйте определиться.
При большом количестве строк в DW и интенсивном использовании в вычисляемых полях
функций может быть тормоз в построении DW и скроллинге DW.
...
Рейтинг: 0 / 0
Медленный отчет
    #35998767
lioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за советы.
Работал медленно запрос, ДВ тут не при чем.
Прибегнул к пункту 3) совета Anatoly Moskovsky и отчет стал формироваться за 3-4 секунды.
Но так и не смог понять как вычислять входящее и исходящее сальдо в одно подзапросе.
В таблице сальдо есть две записи:
dirhouseno_accountsumperiod1110002009.04.011112002009.05.01
1000 - долг на конец апреля (04)
1200 - долг на конец мая (05)
Как обьединить их в одну запись если пользователь хочет получить данные за май месяц, чтобы входящее сальдо было равно 1000 и исходящее 1200.
В ДВ при этом передается одна дата вида 2009.05.01.
...
Рейтинг: 0 / 0
Медленный отчет
    #35999290
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lionerНо так и не смог понять как вычислять входящее и исходящее сальдо в одно подзапросе.
В таблице сальдо есть две записи:
dirhouseno_accountsumperiod1110002009.04.011112002009.05.01
1000 - долг на конец апреля (04)
1200 - долг на конец мая (05)
Как обьединить их в одну запись если пользователь хочет получить данные за май месяц, чтобы входящее сальдо было равно 1000 и исходящее 1200.
В ДВ при этом передается одна дата вида 2009.05.01.
Так я ж писал: проверку месяца перенести в when case ...end и разнести по четырем столбцам(деб/кре * вх/исх)
Например (предполагая что ваша СУБД поддерживает when):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  dirhouse,
  no_account
  WHEN months(period) = months('2009.05.01') -  1  AND sum >  0  THEN sum ELSE  0  END AS vhoddeb,
  WHEN months(period) = months('2009.05.01') -  1  AND sum <  0  THEN sum ELSE  0  END AS vhodkr,
  WHEN months(period) = months('2009.05.01')  AND sum >  0  THEN sum ELSE  0  END AS ishoddeb,
  WHEN months(period) = months('2009.05.01')  AND sum <  0  THEN sum ELSE  0  END AS ishodkr
...
FROM...
WHERE months(period) >= months('2009.05.01') -  1 
  AND months(period) <= months('2009.05.01')

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


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