AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2007, 13:50   #1  
KpecT is offline
KpecT
Участник
 
56 / 10 (1) +
Регистрация: 14.08.2007
Lightbulb Оптимизировать запрос
Данный запрос работает от 7 до 8 мин., сильно долго. Помогииииииииите

while select sum(AmountMST),AccountNum,Dimension[4],Voucher
from
ledgerTrans
index hint ACDate
group by Dimension[4],AccountNum,Voucher
where (ledgerTrans.AccountNum == #Account08_20
|| ledgerTrans.AccountNum == #Account08_30
|| ledgerTrans.AccountNum == #Account08_80
|| ledgerTrans.AccountNum == #Account08_90
|| ledgerTrans.AccountNum == #Account08_91
|| ledgerTrans.AccountNum == #Account08_92)
&& ledgerTrans.TransDate <= transdate
&& ledgerTrans.PeriodCode == PeriodCode::Regular
&& !(ledgerTrans.Voucher like "IV05*")
{
select firstonly firstFast RecId
from
inventTrans
where inventTrans.Voucher == ledgerTrans.Voucher;
if (!inventTrans.RecId)
{
value = ledgerTrans.AmountMST;
b = [ledgerTrans.Dimension[4],ledgerTrans.AccountNum];
simap = this.SetMap(simap,value,b);
}
}
Старый 01.11.2007, 14:04   #2  
UNRW is offline
UNRW
Участник
 
383 / 67 (3) ++++
Регистрация: 16.09.2004
Адрес: Москва
сделайте все в одном select
разбейте lederTrans на выбрку по дебету и по кредиту и сделайте outer join InventTrans

lederTransDeb
lederTransCred
InventTrans
Старый 01.11.2007, 14:10   #3  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,734 / 406 (17) +++++++
Регистрация: 23.03.2006
1) сделайте один индекс по полям входящим в группировку и в where
2) notexists join inventtrans и сделайте индекс по полю voucher
Старый 01.11.2007, 14:13   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
X++:
    while select 
            Dimension[4],
            AccountNum,
            Voucher,
            sum(AmountMST)
    from ledgerTrans
    group by
        Dimension[4],
        AccountNum,
        Voucher
    where
        (ledgerTrans.AccountNum == #Account08_20
        || ledgerTrans.AccountNum == #Account08_30
        || ledgerTrans.AccountNum == #Account08_80
        || ledgerTrans.AccountNum == #Account08_90
        || ledgerTrans.AccountNum == #Account08_91
        || ledgerTrans.AccountNum == #Account08_92)
        && ledgerTrans.TransDate <= transdate
        && ledgerTrans.PeriodCode == PeriodCode::Regular
        && !(ledgerTrans.Voucher like "IV05*")
    notexists join inventTrans
    where inventTrans.Voucher == ledgerTrans.Voucher
    {
        value   = ledgerTrans.AmountMST;
        b       = [ledgerTrans.Dimension[4],ledgerTrans.AccountNum];
        simap   = this.SetMap(simap,value,b);
    }
Старый 01.11.2007, 14:13   #5  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Попробуйте последовательно:
1. Если у вас MS SQL - выкиньте из запроса index hint ACDate
2. Постройте индекс по таблице InventTrans с полями:
- Voucher
- RecId
3. На таблице LedgerTrans в индекс VoucherDateIdx помимо полей:
- Voucher
- TransDate
добавьте еще вниз поля:
- AccountNum
- PeriodCode
- Dimension[4]
- AmountMST

PS. Последовательность полей в индексе очень важна !
Старый 01.11.2007, 14:35   #6  
KpecT is offline
KpecT
Участник
 
56 / 10 (1) +
Регистрация: 14.08.2007
Работать стал 15 сек.
Спасибо, очень помогли.
Старый 01.11.2007, 15:38   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Какой конкретно совет помог?
Старый 01.11.2007, 15:53   #8  
KpecT is offline
KpecT
Участник
 
56 / 10 (1) +
Регистрация: 14.08.2007
Как раз подумал, что страна должна знать своих героев:
1. ice по идее все написал, что нужно было сделать
2. Владимир Максимов показал, как это должно выглядеть в коде.
3. Alexius подсказал с index' ми.

Последний раз редактировалось KpecT; 01.11.2007 в 15:57.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача параметров в запрос while select tolstjak DAX: Программирование 13 15.02.2009 19:39
Как собрать запрос? moid DAX: Программирование 11 02.07.2007 12:07
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
Не работает запрос на нескольких компаниях Bega DAX: Программирование 3 16.09.2005 10:21

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:10.