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.
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');