|
Медленный отчет
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть DW, в котором такой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Отчет выполняется почти 5 минут... Как можно ускорить работу отчета? Зараннее спасибо за советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:11 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
Отказаться от вложенных запросов, использовать join-ы и group by. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:17 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
КолопроктологОтказаться от вложенных запросов, использовать 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 - таблица домов ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:24 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
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 - таблица домов Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:33 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
Колопроктолог Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы. Да, действительно ДВ на основе хранимой процедуры, выдающей селект из временной таблицы в которую до этого в курсоре заносятся вложенные запросы исходного запроса работает немного быстрее: чуть меньше 4-х минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:40 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
lionerКолопроктолог Признаться, писать запрос за Вас лень. Если не получается одним легким* запросом, то используйте хранимую процедуру, в процедуре пользуйте, например, временные таблицы. Да, действительно ДВ на основе хранимой процедуры, выдающей селект из временной таблицы в которую до этого в курсоре заносятся вложенные запросы исходного запроса работает немного быстрее: чуть меньше 4-х минут.Сарказм? В любом случае, пишите скрипт хранимки. Вам уже ответили: вложенные запросы - "узкое место". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 17:46 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
Сколько из 5 минут занимает время выполнения запроса? Подзапросы типа >0 <0 =1 =-1 можно из 2-х свернуть в 1, если об этом не догадывается оптимизатор например... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2009, 22:32 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
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 тут причем? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2009, 05:23 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
А что за база то? Для Sybase ASE, MS SQL, Oracle - решения совершенно разные ----------------------------------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2009, 09:55 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
/В ДВ есть группа по полю dh.gek - вычисляемые поля для полей vhoddeb,vhodkr,sumnach,sumopl,ishoddeb,ishodkr. И такие же вычисляемые поля в банде суммари. Отчет выполняется почти 5 минут... Как можно ускорить работу отчета? Зараннее спасибо за советы. Вы не пытались определить, что выполняется долго? - cам запрос - формирование DW Попробуйте определиться. При большом количестве строк в DW и интенсивном использовании в вычисляемых полях функций может быть тормоз в построении DW и скроллинге DW. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2009, 11:31 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
Спасибо всем за советы. Работал медленно запрос, ДВ тут не при чем. Прибегнул к пункту 3) совета Anatoly Moskovsky и отчет стал формироваться за 3-4 секунды. Но так и не смог понять как вычислять входящее и исходящее сальдо в одно подзапросе. В таблице сальдо есть две записи: dirhouseno_accountsumperiod1110002009.04.011112002009.05.01 1000 - долг на конец апреля (04) 1200 - долг на конец мая (05) Как обьединить их в одну запись если пользователь хочет получить данные за май месяц, чтобы входящее сальдо было равно 1000 и исходящее 1200. В ДВ при этом передается одна дата вида 2009.05.01. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2009, 12:36 |
|
Медленный отчет
|
|||
---|---|---|---|
#18+
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.
Далее во внешнем запросе надо сгруппровать и просуммировать (что вы вроде бы уже реализовали). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2009, 14:44 |
|
|
start [/forum/topic.php?fid=15&fpage=34&tid=1336276]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 313ms |
total: | 472ms |
0 / 0 |