Имеется инфоблок, с кучей свойств (около сотни, причем примерно половина - связанные инфоблоки со своими свойствами, которые тоже могут содержать связанные элементы, пока ограничено третьим уровнем).
Инфоблок находится под документооборотом.
Сейчас в инфоблоке порядка 400 записей.
Делаю выборку (оставил только часть, которая относится к теме):
Это получаются значения первого уровня... Далее таким-же образом получаются элементы второго и третьего уровней.
При этом система на хорошем сервере уже сильно притормаживает (выборка всех элементов идет более 1 минуты).
Начал смотреть в чем дело... В базу делается очень много запросов.
$obElement->GetFields() - это дополнительные запросы в базу, тоесть для каждого элемента выполняется помимо всего еще как минимум 1 запрос дополнительный, даже с учетом того, что в $arSelect перечислены все поля, которые мне нужны.
Тоесть для каждого свойства делается запрос вида:
Попробовал обойтись без $obElement->GetFields(), но тогда возвращается массив с ключами типа 'PROPERTY_{ID}', а не 'PROPERTY_{CODE}', как хотелось-бы, более того, для селектов возвращаются ID значения, а не непосредственно значение. Нет кода так-же если указать 'PROPERTY_*'.
Хотел сделать следующим образом: получить вначале id нужных элементов (применив фильтры и сортировки), а затем одним методом получить сразу все свойства. Но выясняю, что CIBlockElement::GetProperty - которое то, что я хотел, принимает только 1 элемент в качестве параметра, а похожих методов, которым можно скормить сразу несколько элементов - нет.
Какие есть способы стандартными средствами, через стандартное АПИ сократить количество запросов в базу?
Инфоблок находится под документооборотом.
Сейчас в инфоблоке порядка 400 записей.
Делаю выборку (оставил только часть, которая относится к теме):
Код |
---|
$data = array(); $rsElements = CIBlockElement::GetList($arSort, $arFilter, $arGroup, $arNavParams, $arSelect); while ($obElement = $rsElements->GetNextElement()) { if ($obElement) { $arItem = $obElement->GetFields(); } else { $arItem = array(); } $data[$arItem['ID']] = $arItem; } |
Это получаются значения первого уровня... Далее таким-же образом получаются элементы второго и третьего уровней.
При этом система на хорошем сервере уже сильно притормаживает (выборка всех элементов идет более 1 минуты).
Начал смотреть в чем дело... В базу делается очень много запросов.
$obElement->GetFields() - это дополнительные запросы в базу, тоесть для каждого элемента выполняется помимо всего еще как минимум 1 запрос дополнительный, даже с учетом того, что в $arSelect перечислены все поля, которые мне нужны.
Тоесть для каждого свойства делается запрос вида:
Код |
---|
SELECT BP.* FROM b_iblock_property BP, b_iblock B WHERE BP.IBLOCK_ID=B.ID AND B.ID IN (IBLOCK_ID) AND UPPER(BP.CODE)=UPPER('CODE_OF_PROPERTY') |
Попробовал обойтись без $obElement->GetFields(), но тогда возвращается массив с ключами типа 'PROPERTY_{ID}', а не 'PROPERTY_{CODE}', как хотелось-бы, более того, для селектов возвращаются ID значения, а не непосредственно значение. Нет кода так-же если указать 'PROPERTY_*'.
Хотел сделать следующим образом: получить вначале id нужных элементов (применив фильтры и сортировки), а затем одним методом получить сразу все свойства. Но выясняю, что CIBlockElement::GetProperty - которое то, что я хотел, принимает только 1 элемент в качестве параметра, а похожих методов, которым можно скормить сразу несколько элементов - нет.
Какие есть способы стандартными средствами, через стандартное АПИ сократить количество запросов в базу?