|
![]() |
#1 |
Участник
|
Нельзя оптимизировать, не зная статистики. Вот этот rowQuota - это большая таблица или маленькая? Что делает intvNo? Нельзя ли сделать, чтобы выбор записей был по индексу, если таблица большая. Нельзя ли использовать insert_recordset
|
|
|
За это сообщение автора поблагодарили: MikeR (2). |
![]() |
#2 |
Участник
|
Есть временная таблица rowQuota с ДатаС, ДатаПо и Периодом. Если Период меньше, чем кол-во месяцев между датами, то создаём новую строку, где ДатаС = ДатаС+месяц(Период)
Таблица не очень большая, около 100к записей. Да, с индексом в 2 раза быстрее получилось. И решил использовать RecordInsertList X++: ttsbegin; list = new RecordInsertList(rowQuotaTmp.TableId); while select rowQuota index hint Idx { buf2buf(rowQuota, rowQuotaTmp); monthDiff = intvNo(rowQuotaTmp.DateTo, rowQuotaTmp.DateFrom, IntvScale::Month); dayDiff = intvNo(rowQuotaTmp.DateTo, rowQuotaTmp.DateFrom, IntvScale::Day); while(rowQuotaTmp.UsagePeriod <= monthDiff && dayDiff > 0) { rowQuotaTmp.DateFrom = dateMthFwd(rowQuotaTmp.DateFrom, rowQuotaTmp.UsagePeriod); rowQuotaTmp.DatePotreb = rowQuotaTmp.DateFrom; //rowQuota.insert(); list.add(rowQuotaTmp); monthDiff = intvNo(rowQuotaTmp.DateTo, rowQuotaTmp.DateFrom, IntvScale::Month); dayDiff = intvNo(rowQuotaTmp.DateTo, rowQuotaTmp.DateFrom, IntvScale::Day); } } list.insertDatabase(); ttscommit; |
|
![]() |
#3 |
Участник
|
Цитата:
Т.е. при добавлении если ДатаС + Период < ДатаПо, тогда добавляем еще 1 запись, где ДатаС = ДатаС + Период и т.д. |
|
![]() |
#4 |
Участник
|
Если таблица rowQuota временная, то использовать RecordInsertList совершенно бессмысленно. Он помогает тогда, когда таблица расположена в базе данных и сокращает количество пакетов на вставку именно в базу данных (при некоторых других условиях).
|
|
|
За это сообщение автора поблагодарили: SuperStar88 (1). |
|
|