Wiki Bitrix

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)