SQL-представление свойств элемента инфоблока
Битрикс создает неоптимальные SQL-запросы:
LEFT JOIN
- если свойство появилось после создания элемента инфоблокаWHERE prop = «something» OR prop IS NULL
Проведем небольшое расследование на примере элемента инфоблока 4994277:
SELECT * FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = 4994277 \G *************************** 1. ROW *************************** ID: 56862578 IBLOCK_PROPERTY_ID: 279 IBLOCK_ELEMENT_ID: 4994277 VALUE: 000105539 VALUE_TYPE: text VALUE_ENUM: NULL VALUE_NUM: 105539.0000 DESCRIPTION: NULL -- другие строки
Создадим удобное для нас представление:
DROP VIEW IF EXISTS `vendor_logistic_1c_info`; CREATE VIEW `vendor_logistic_1c_info` AS SELECT prim.VALUE_NUM AS `TENDER_ID`, prop_1.VALUE AS `KOD_RS`, prop_2.VALUE AS `NAME_RS`, prop_3.VALUE AS `ZAKAZ`, prop_4.VALUE AS `ITEM_NUM` FROM `b_iblock_element_property` AS `prim` JOIN `b_iblock_element_property` AS `prop_1` ON (prim.IBLOCK_ELEMENT_ID = prop_1.IBLOCK_ELEMENT_ID AND prop_1.IBLOCK_PROPERTY_ID = 279) JOIN `b_iblock_element_property` AS `prop_2` ON (prim.IBLOCK_ELEMENT_ID = prop_2.IBLOCK_ELEMENT_ID AND prop_2.IBLOCK_PROPERTY_ID = 280) JOIN `b_iblock_element_property` AS `prop_3` ON (prim.IBLOCK_ELEMENT_ID = prop_3.IBLOCK_ELEMENT_ID AND prop_3.IBLOCK_PROPERTY_ID = 281) JOIN `b_iblock_element_property` AS `prop_4` ON (prim.IBLOCK_ELEMENT_ID = prop_4.IBLOCK_ELEMENT_ID AND prop_4.IBLOCK_PROPERTY_ID = 282) WHERE prim.IBLOCK_PROPERTY_ID = 278;
- конструкция
prim.VALUE_NUM AS `TENDER_ID`
используется как «псевдопервичный» ключ (на деле оказалось что есть дубли) VALUE_NUM
используется вместоVALUE
для ускорения выполнения запроса
Вариант использования:
SELECT sql_no_cache * FROM vendor_logistic_1c_info WHERE TENDER_ID = 4979188; +--------------+-----------+----------------+----------------------------------------+--------------------------------------+ | TENDER_ID | KOD_RS | NAME_RS | ZAKAZ | ITEM_NUM | +--------------+-----------+----------------+----------------------------------------+--------------------------------------+ | 4979188.0000 | 000105485 | 22.10.2018/ООО | заказ № 00012554 от 22.10.2018 5:39:22 | ТН № ХИ1003028 от 22.10.2018 6:10:06 | | 4979188.0000 | 000105485 | 22.10.2018/ООО | заказ № 00012554 от 22.10.2018 5:39:22 | ТН № ХИ1003027 от 22.10.2018 6:07:15 | +--------------+-----------+----------------+----------------------------------------+--------------------------------------+ 2 ROWS IN SET (0.00 sec)