function getAvailableElementsCount(array $arSections) { $res = \Bitrix\Iblock\SectionElementTable::getList(array( 'select' => array('CNT', 'IBLOCK_SECTION_ID'), 'filter' => array( 'IBLOCK_SECTION_ID' => $arSections, 'PRODUCT.AVAILABLE' => 'Y', 'ELEMENT.ACTIVE' => 'Y' ), 'runtime' => array( new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)'), 'PRODUCT' => array( 'data_type' => '\Bitrix\Catalog\ProductTable', 'reference' => array( '=this.IBLOCK_ELEMENT_ID' => 'ref.ID' ), 'join_type' => 'left' ), 'ELEMENT' => array( 'data_type' => '\Bitrix\Iblock\ElementTable', 'reference' => array( '=this.IBLOCK_ELEMENT_ID' => 'ref.ID' ), 'join_type' => 'left' ) ) )); return $res->fetchAll(); } |
По идее сравнивать в текущем варианте неправильно, но вот результат:
CIBlockSection
ORM
Код:
CIBlockSection
array(3) { ["ID"]=> string(3) "702" ["SORT"]=> string(3) "100" ["ELEMENT_CNT"]=> string(4) "6840" } array(3) { ["ID"]=> string(3) "835" ["SORT"]=> string(4) "2440" ["ELEMENT_CNT"]=> string(4) "5396" } float(0.022021) |
ORM
array(2) { [0]=> array(2) { ["CNT"]=> string(4) "1279" ["IBLOCK_SECTION_ID"]=> string(3) "702" } [1]=> array(2) { ["CNT"]=> string(3) "271" ["IBLOCK_SECTION_ID"]=> string(3) "835" } } float(0.01721) |
Код:
\Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('catalog'); $s1 = microtime(); $res = \CIBlockSection::GetList(array("SORT"=>"ASC"), array('ID' => array(702,835)), true, array('ID')); while($sc = $res->Fetch()) { var_dump($sc); } var_dump(microtime()-$s1); $s2 = microtime(); $res = \Bitrix\Iblock\SectionElementTable::getList(array( 'select' => array('CNT', 'IBLOCK_SECTION_ID'), 'filter' => array( 'IBLOCK_SECTION_ID' => array(702,835), 'PRODUCT.AVAILABLE' => 'Y', 'ELEMENT.ACTIVE' => 'Y' ), 'runtime' => array( new \Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)'), 'PRODUCT' => array( 'data_type' => '\Bitrix\Catalog\ProductTable', 'reference' => array( '=this.IBLOCK_ELEMENT_ID' => 'ref.ID' ), 'join_type' => 'left' ), 'ELEMENT' => array( 'data_type' => '\Bitrix\Iblock\ElementTable', 'reference' => array( '=this.IBLOCK_ELEMENT_ID' => 'ref.ID' ), 'join_type' => 'left' ) ) )); var_dump($res->fetchAll()); var_dump(microtime()-$s2); |