|  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. | 
|  |