JDatabase
を使用して1分近くかかる単純なクエリがありますが、sqlsrv_connectを使用すると1秒未満で完了します。
_ $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();
_
出力は次のとおりです。
タイムマニュアル:0.046799182891846
Time Joomla:51.681474924088
ここで何が起こっているのでしょうか?
JDatabase
が呼び出すfetchArray()
関数に絞り込み、_sqlsrv_fetch_array
_を呼び出し、結果の各行に最大2秒かかります!手動バージョンと本質的に同じことをしているように見えますが、なぜタイミングに大きな違いがあるのか分かりません。
私も$db->loadObjectList()
と$db->loadAssocList()
を試しましたが、同じ結果が得られます。
まず、クエリを間違った方法で作成します。次のようになります。
$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');