пятница, 25 октября 2013 г.

Включение отладки sql-запросов

Иногда бывает очень важно узнать какой SQL запрос составляет и выполняет та или иная функция битрикса.

Изучая исходный код, можно обнаружить, что в наследниках CAllDatabase для проверки необходимости логгирования используются свойства $DebugToFile и $ShowSqlStat.

Таким образом, для того чтобы увидеть какие запросы выполняются, достаточно выполнить следующий код:

$GLOBALS['DB']->DebugToFile = true;

Все последующие запросы будут сложены в файл mysql_debug.sql в корне сайта.

Как получить количество пользователей

Нормального способа узнать количество пользователей подходящих по фильтру не существует. Официально способы подсчета вообще не документированы, но есть по меньшей мере два таких.
Первый есть в пользовательских комментариях к описанию функции CUser::GetList и реализуется через выборку одного элемента при постраничной навигации:

$rsUsers = CUser::GetList(
    $arOrder,
    $cdv,
    array(
        "LAST_LOGIN_1" => $DATE_LAST_LOGIN
    ),
    array(
        'NAV_PARAMS' => array(
            "nPageSize" => 1,
            "bDescPageNumbering" => "N",
            "bShowAll" => "N"
        )
    )
);
echo $rsUsers->NavRecordCount;

Второй, по сути идентичный, который работает за счет добавленного начиная с версии 11.0.14 параметра nTopCount и судя по исходному коду CUser::GetList единственный который реально делает SELECT COUNT *, а не SQL_CALC_FOUND_ROWS/FOUND_ROWS:

$rsUsers = CUser::GetList(
    $arOrder,
    $cdv,
    array(),
    array(
        'NAV_PARAMS' => array(
            "nTopCount" => 0
        )
    )
);
echo $rsUsers->NavRecordCount;

Стоит отметить, что и том и другом случае, выбирается один элемент, что является избыточным.