web-dev-qa-db-ja.com

JDatabaseとManualを使用した非常に遅いクエリ

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()を試しましたが、同じ結果が得られます。

1
doovers

まず、クエリを間違った方法で作成します。次のようになります。

$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ń