Запрос SQL Server Count занимает слишком много времени

Я немного запутался в SQL Server или SQLSRV библиотека с подсчетом запросов.

Пожалуйста, рассмотрите этот код:

<?php
$sql=<<<SQL
        SELECT id,
            ...
        FROM ...
        WHERE ....
SQL;

    $serverName = "sqlserver";
    $connectionInfo = array( "Database"=>"mydb", "UID"=>"myuser", "PWD"=>"mupwd" );
    $conn = sqlsrv_connect( $serverName, $connectionInfo);
    if( $conn === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    $time=microtime(true);
    $params = array();
    $options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
    $stmt = sqlsrv_query( $conn, $sql, $params, $options);
    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    echo "Result: ".sqlsrv_num_rows($stmt)."<br>\r\n";
    echo "Time for sqlsrv_num_rows: ".(microtime(true)-$time)."s<br>\r\n";

    $countsql=<<<SQL
        SELECT COUNT(id) FROM (
            $sql
         ) counter
SQL;
    $time=microtime(true);
    $stmt = sqlsrv_query( $conn, $countsql);
    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }
    echo "Result: ".array_pop(sqlsrv_fetch_array($stmt,SQLSRV_FETCH_NUMERIC))."<br>\r\n";
    echo "Time for count-query and one-row sqlsrv_fetch_array: ".(microtime(true)-$time)."s<br>\r\n";

Это мой результат:

Result: 2332
Time for sqlsrv_num_rows: 0.18062806129456s

Result: 2332
Time for count-query and one-row sqlsrv_fetch_array: 14.647264957428s

Тот же результат с двумя методами (sqlsrv_num_rows на основной запрос или sqlsrv_fetch_array в запросе счета) занимает 0,18 или 14 с.

Пожалуйста, не заботьтесь о запросе, это запрос с плохо проиндексированной таблицей из многих тысяч строк, но я не могу отредактировать таблицу, запрос или индексы, так что я пытаюсь понять, почему счет в запросе такой большой против счетчика в курсоре.

Более того, я попытался выполнить запрос подсчета в клиенте SQL Server Management Studio, и это заняло очень мало времени (<1 с), как в моем первом тесте. Так что мне интересно, если это может быть SQLSRV вопрос библиотеки.

0 ответов

Другие вопросы по тегам