Здравствуйте! Столкнулся с тем, что на одном сайте стал сильно тормозить обмен с 1С. Причем выгрузка 10 товаров на сайт занимает более 15 минут.
Скрипт типовой /bitrix/admin/1c_exchange.php
Анализ показал, что тормоза начинаются на этапе расшифровки таблицы b_xml_tree. В мониторе производительности выявлены запросы следующего вида:
DELETE FR OM
b_iblock_property_enum
WHERE
ID = 4412
AND NOT EXISTS (
SEL ECT *
FR OM
b_iblock_element_prop_s5
WH ERE
b_iblock_element_prop_s5.PROPERTY_770 = b_iblock_property_enum.ID
)
Т.е. все свойства в виде списка по окончании загрузки проверяются на наличие в инфоблоке, и несуществующие удаляются.
Свойства одного инфоблока хранятся линейно в таблице b_iblock_element_prop_s5. Значения для списка свойств в b_iblock_property_enum. Так как отдельной индексации по полям свойств нет (например, PROPERTY_770), то поиск идёт крайне медленно, каждый запрос на удаление около 0.2 с
Возникает вопрос к разработчикам:
1) Зачем это делать при каждом обмене?
2) Зачем проверять все подряд?
3) Зачем это делать множеством простых запросов вместо одного сложного, но быстрого?
Я, конечно, попытаюсь улучшить ситуацию, установив индексы на каждое свойство типа int, но сам подход , полагаю, порочен. Для чистки базы следует выделить отдельный процесс, а не привязывать его к регулярному обмену.
Вопрос по существу:
а) Можно отключить "чистку свойств" при обмене с 1С?
б) Если нельзя, то как оптимизировать базу для ускорения обмена?
Скрипт типовой /bitrix/admin/1c_exchange.php
Анализ показал, что тормоза начинаются на этапе расшифровки таблицы b_xml_tree. В мониторе производительности выявлены запросы следующего вида:
DELETE FR OM
b_iblock_property_enum
WHERE
ID = 4412
AND NOT EXISTS (
SEL ECT *
FR OM
b_iblock_element_prop_s5
WH ERE
b_iblock_element_prop_s5.PROPERTY_770 = b_iblock_property_enum.ID
)
Т.е. все свойства в виде списка по окончании загрузки проверяются на наличие в инфоблоке, и несуществующие удаляются.
Свойства одного инфоблока хранятся линейно в таблице b_iblock_element_prop_s5. Значения для списка свойств в b_iblock_property_enum. Так как отдельной индексации по полям свойств нет (например, PROPERTY_770), то поиск идёт крайне медленно, каждый запрос на удаление около 0.2 с
Возникает вопрос к разработчикам:
1) Зачем это делать при каждом обмене?
2) Зачем проверять все подряд?
3) Зачем это делать множеством простых запросов вместо одного сложного, но быстрого?
Я, конечно, попытаюсь улучшить ситуацию, установив индексы на каждое свойство типа int, но сам подход , полагаю, порочен. Для чистки базы следует выделить отдельный процесс, а не привязывать его к регулярному обмену.
Вопрос по существу:
а) Можно отключить "чистку свойств" при обмене с 1С?
б) Если нельзя, то как оптимизировать базу для ускорения обмена?