30.04.2008, 17:41 | #1 |
Участник
|
Цикл в цикле
Проблема вообще такая
(4-ая Аксапта, MS SQL) X++: while select PMPlaceSecurityTimetable exists join PlaceId from PMPlaceTimeBoard where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure { timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard)); timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId),fieldnum(PMPlaceTimeBoard, DateStart), fieldnum(PMPlaceTimeBoard, PlannedTimeStart)); while select PMPlaceTimeBoard1 where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure && PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId { timeList2.ins(PMPlaceTimeBoard1); } |
|
30.04.2008, 17:47 | #2 |
Member
|
Попробуйте написать для начала
while select forceplaceholders PMPlaceTimeBoard1 А вообще если выборка большая реально, то чего вы ожидаете от кода? Значит будет долго работать.
__________________
С уважением, glibs® |
|
30.04.2008, 17:52 | #3 |
Участник
|
Цитата:
Сообщение от darmen
Проблема вообще такая
(4-ая Аксапта, MS SQL) X++: while select PMPlaceSecurityTimetable exists join PlaceId from PMPlaceTimeBoard where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure { timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard)); timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId),fieldnum(PMPlaceTimeBoard, DateStart), fieldnum(PMPlaceTimeBoard, PlannedTimeStart)); while select PMPlaceTimeBoard1 where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure && PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId { timeList2.ins(PMPlaceTimeBoard1); } X++: timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard)); timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId), fieldnum(PMPlaceTimeBoard, DateStart), fieldnum(PMPlaceTimeBoard, PlannedTimeStart)); while select PMPlaceSecurityTimetable join PMPlaceTimeBoard where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure && PMPlaceTimeBoard.PlaceId == PMPlaceSecurityTimetable.PlaceId { timeList2.ins(PMPlaceTimeBoard); }
__________________
С уважением, Dozer Последний раз редактировалось Dozer; 30.04.2008 в 22:25. Причина: Опечатка |
|
30.04.2008, 18:08 | #4 |
Участник
|
2Dozer
Я так сам пробовал, но получается, что второй цикл просто отсутсвует. То есть происходит выборка не всех данных, которые нужны. 2glibs Данных действительно много. Вот поэтому я и ищу способ избавиться от второго цикла или как-то его сделать без селекта, что ли... |
|
30.04.2008, 18:16 | #5 |
Участник
|
А если
X++: while select PMPlaceSecurityTimetable exists join PlaceId from PMPlaceTimeBoard where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure outer join PMPlaceTimeBoard1 where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure && PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId { if (PMPlaceTimeBoard1) timeList2.ins(PMPlaceTimeBoard1); } |
|
30.04.2008, 18:20 | #6 |
Member
|
Цитата:
Сообщение от darmen
...
Данных действительно много. Вот поэтому я и ищу способ избавиться от второго цикла или как-то его сделать без селекта, что ли ... forceplaceholders не помог?
__________________
С уважением, glibs® |
|
30.04.2008, 18:34 | #7 |
Участник
|
|
|
30.04.2008, 19:54 | #8 |
Участник
|
Цитата:
Только, почему Вы решили, что отбираются не все данные? Вы проверили содержимое timeList2 или это Ваше предположение? Приведенный Dozer код точно соответствует Вашему же описанию. Или Вы что-то пропустили? Кстати, уменьшить время выборки можно еще путем перечисления нужных полей. Даст существенный прирост производительности, если нужно несколько полей из нескольких десятков имеющихся в таблицах. |
|
30.04.2008, 22:53 | #9 |
Member
|
Цитата:
Сообщение от kashperuk
...
Код я не проверял - так просто, как идея. ... Там внутри первого цикла постоянно переинициализируется RecordSortedList. Внутри одного запроса чтобы это сделать... как минимум придется добавлять сортировку. А вообще чтобы что-то посоветовать, нужно описать задачу. В первом цикле связь организована не по ключевым полям. Вероятно, что не хватает индексов. И сама по себе такая связь вызывает подозрение в корректности кода. Для чего потребовался RecordSortedList во втором запросе тоже не очевидно. Можно было бы просто на запросе сортировку поставить. Возможно, с группировкой. Т.к. опять же непонятно, что является ключем на PMPlaceTimeBoard (т.е. непонятно, будут ли в RecordSortedList записи выбивать друг друга).
__________________
С уважением, glibs® |
|
03.05.2008, 23:56 | #10 |
----------------
|
На первый взгляд
Во-первых, странно, что во втором select есть связь по PlaceId, которой нет в первом select.
Во-вторых, нам трудно судить о том, что действительно тормозит работу кода. Это может быть неверный план испонения обоих запросов, сложный алгоритм обработки RecordSortedList или что-то еще, что вы упустили в своем примере. Посомтрите планы исполнения запросов и индексы на PMPlaceTimeBoard. В-третьих, может быть подумать о том, чтобы обрабатывались не ВСЕ данные из пары PMPlaceSecurityTimetable, PMPlaceTimeBoard? Зачем обрабатывать данные от начала времен? Как вариант. Сделайте обычный join с сортировками по PlaceId и DateStart (или DateSecure - зависит от индексов), ограничьте список полей только необходимыми, формируйте и обрабатывайте свой RecordSortedList по смене значений полей в курсоре (PlaceId и DateStart)... и не забудьте по окончаению цикла обработать последний RSL. кривовато, конечно, но что не сделаешь ради перфоманса to kashperuk. Сомневаюсь, что такое вообще возможно в Аксапте. |
|
05.05.2008, 12:50 | #11 |
Участник
|
Начните с выборки полей, я думаю это может немного сдвинуть скорость в большую сторону
|
|
Теги |
ax4.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
Как организовать цикл | 1 | |||
Складская аналитика. Авторезервирование. Бесконечный цикл. | 8 | |||
Цикл, ttsabort и continue | 8 | |||
Report в цикле с параметром | 3 | |||
Перебор контролов в цикле | 10 |
|