01.11.2007, 13:50 | #1 |
Участник
|
Оптимизировать запрос
Данный запрос работает от 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 |
Участник
|
сделайте все в одном select
разбейте lederTrans на выбрку по дебету и по кредиту и сделайте outer join InventTrans lederTransDeb lederTransCred InventTrans |
|
01.11.2007, 14:10 | #3 |
Участник
|
1) сделайте один индекс по полям входящим в группировку и в where
2) notexists join inventtrans и сделайте индекс по полю voucher |
|
01.11.2007, 14:13 | #4 |
Участник
|
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 |
Участник
|
Попробуйте последовательно:
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 |
Участник
|
Работать стал 15 сек.
Спасибо, очень помогли. |
|
01.11.2007, 15:38 | #7 |
Участник
|
Какой конкретно совет помог?
|
|
01.11.2007, 15:53 | #8 |
Участник
|
Как раз подумал, что страна должна знать своих героев:
1. ice по идее все написал, что нужно было сделать 2. Владимир Максимов показал, как это должно выглядеть в коде. 3. Alexius подсказал с index' ми. Последний раз редактировалось KpecT; 01.11.2007 в 15:57. |
|