web-dev-qa-db-fra.com

Requête très lente avec JDatabase vs Manual

J'ai une requête simple qui prend presque une minute en utilisant JDatabase mais prend moins d'une seconde lorsque j'utilise sqlsrv_connect.

    $time_pre = microtime(true);

    $conn_array = array (
        "Database" => "Test",
    );
    $conn = sqlsrv_connect('SQL01\SQL01', $conn_array);
    if ($conn) {
        $result = array();
        if (($qryresult = sqlsrv_query($conn,"SELECT e.*, c.Description AS Cell FROM Edms AS e LEFT JOIN Cells AS c ON c.ID=e.Cell_ID")) !== false) {
            while( $row = sqlsrv_fetch_array($qryresult, SQLSRV_FETCH_ASSOC) ) {
                $result[] = $row;
            }
        }
    }
    else {
        die(print_r(sqlsrv_errors(), true));
    }

    $time_post = microtime(true);
    $exec_time = $time_post - $time_pre;
    echo 'Time manual: '.$exec_time.'<br>';
    $time_pre = microtime(true);

    $db = $this->getDbo();
    $query = $db->getQuery(true);

    $query->select('e.*, c.Description AS Cell FROM Edms AS e LEFT JOIN Cells AS c ON c.ID=e.Cell_ID');

    $db->setQuery($query);
    $result = $db->loadRowList();

    $time_post = microtime(true);
    $exec_time = $time_post - $time_pre;
    echo 'Time Joomla: '.$exec_time.'<br>';
    $time_pre = microtime(true);

    JFactory::getApplication()->close();

la sortie est:

Heure manuel: 0.046799182891846
Time Joomla: 51.681474924088

Des idées ce qui se passe ici?

Je l'ai réduite à la fonction fetchArray() que JDatabase appelle, qui appelle sqlsrv_fetch_array Et chaque ligne du résultat prend jusqu'à 2 secondes! Cela semble faire essentiellement la même chose que ma version manuelle, mais je ne comprends pas pourquoi cette différence de temps énorme.

J'ai aussi essayé $db->loadObjectList() et $db->loadAssocList(), mais j'obtiens le même résultat.

1
doovers

Tout d'abord, vous construisez votre requête dans le mauvais sens. Ça devrait ressembler à ça:

$query = $db->getQuery(true);
$query->select('e.*, c.Description AS Cell');
$query->from('Edms AS e');
$query->leftJoin('Cells AS c ON c.ID=e.Cell_ID');
1
Artur Stępień