Цитата:
Сообщение от
Qaz Qwerty
Спасибо огромное, помогло, работает и правда долго (минуты 3), но работает.
Ну...
1. Для таблицы UtilIdElements искать можно/достаточно либо по name либо по id. Обновление: Не прав. Фильтрацию по id в общем случае желательно избегать (
см. ниже).
2. На таблице UtilIdElements есть уникальные индексы [recordType, parentId, name, utilLevel] и [recordType, parentId, id, utilLevel], а в вашей задаче все искомые узлы, как я понял, не имеют родителей. Соответственно, добавив в условия выборокк из UtilIdElements поле parentId (и удалив name либо id), получите прибавку к скорости.
3. С помощью xUtilIDElements::getNode() вы получаете узел на произвольном слое utils1.utilLevel, а не на последнем. Конечно на практике может получится, что select firstonly utils1 возвращает как раз запись с последним слоем, но все-таки надеяться на это не стоит. Использование order by utilLevel desc или info.getNode() или др. get/find node поможет, если схему не менять.
4. Встречался со случаями, когда в UtilElements отсутствовали записи для последних слоев (
см. еще тут).
5. Если задачу решать через UtilElements/UtilIdElements, то можно попробовать один select для UtilElements/UtilIdElements, а не два - ну это уже имхо.