0

完全な機能コードで更新

IIS 7.5 で PHP を実行して、別のサーバーでホストされている SQL Server データベースに接続しています...

私は自分のウェブページを完全に機能させていますが、このような単純なクエリを実行するには時間がかかります...ループごとに (12*3)*n の結果のみを返します。私は... 単純なページが私を返す必要があります: ((12*3)*14) * 3 つの結果... 説明します: ((12 * 3) * サービス) * NUMBER OF TABLES (Banksphere and Umbrales * 2 あなたが見るように...)

私はほぼ 200 万行あり、毎日約 20.000 行増加しているため、問題はテーブルにあると思います... servicio_id、peticion_id、fecha... ページが表示されるまでに 20 ~ 30 秒ほどかかります。また、表示が停止して半分だけ表示されることもあります。アドバイスをお願いします。

public static function getValues($entidad_id, $servicio_id, $peticion_id, $fecha) {

    if(date('d', strtotime($fecha)) >= '28' || date('d', strtotime($fecha)) <= '1') {
        $dia_id = 8;
    } else {
        $dia_id = date('N', strtotime($fecha)) -1;
    }
    echo '<script type="text/javascript" language="javascript"> 
    function openwindow(URL) {
        window.open(URL,"Comentarios","menubar=1,resizable=1,width=700,height=350"); 
    }
    </script>'; 

    $conn = sqlsrv_connect(DB_SERVER.', '.DB_PORT, array("UID"=>DB_USER,  "PWD"=>DB_PASS,  "Database"=>DB_NAME));

    $sqlQuery = sqlsrv_query($conn, "
        SELECT TOP ".OPT_RESULTADOS_MAXIMOS." *
        FROM Banksphere
        WHERE entidad_id = '$entidad_id'
        AND servicio_id = '$servicio_id'
        AND peticion_id = '$peticion_id'
        AND fecha = '".$fecha."'
        ORDER BY hora_id DESC
    ");

    while ($row = sqlsrv_fetch_array($sqlQuery)) {  
        $umbralesQuery = sqlsrv_query($conn, "
            SELECT *
            FROM Umbrales
            WHERE entidad_id = '$row[entidad_id]'
            AND servicio_id = '$row[servicio_id]'
            AND peticion_id = '$row[peticion_id]'
            AND dia_id = '$row[dia_id]'
            AND hora_id = '$row[hora_id]'
            ORDER BY hora_id DESC
        "); 
        $umbralesOk = sqlsrv_query($conn, "
            SELECT *
            FROM Umbrales
            WHERE entidad_id = '$row[entidad_id]'
            AND servicio_id = '$row[servicio_id]'
            AND peticion_id = '0'
            AND dia_id = '$row[dia_id]'
            AND hora_id = '$row[hora_id]'
            ORDER BY hora_id DESC
        "); 
        $umbrales = sqlsrv_fetch_array($umbralesQuery);
        $uOK = sqlsrv_fetch_array($umbralesOk);
        sqlsrv_free_stmt($umbralesQuery);
        sqlsrv_free_stmt($umbralesOk);
        $medias = Umbrales::getValues($uOK['minimo'], $umbrales['minimo']);
        if($row['usuario'] != '') $postedby = 'Comentado por '.$row['usuario'].': '; else $postedby = '';

        if($peticion_id == 0) {
            if($row['valor'] < $medias[0]) {
                $color = "D";
            } else if($row['valor'] > $medias[1]) {
                $color = "A";
            } else {
                $color = "OK";
            }
            $minimo = $medias[0];
            $maximo = $medias[1];
        }
        if($peticion_id == 1) {
            if($row['valor'] > $medias[2]) {
                $color = "D";
            } else {
                $color = "OK";
            }
            $minimo = 0;
            $maximo = $medias[2];
        }
        if($peticion_id == 2) {
            if($row['valor'] > $medias[3]) {
                $color = "D";
            } else {
                $color = "OK";
            }
            $minimo = 0;
            $maximo = $medias[3];
        }           
        if($color == "OK"){
            echo '
            <td title="MINIMO: '.$minimo.' | MAXIMO: '.$maximo.'" class="'.$color.'">'.round($row['valor'], 3).'</td>
            ';
        } else {
            echo '
            <td title="MINIMO: '.$minimo.' | MAXIMO: '.$maximo.'" class="'.$color.'">
                <a href="javascript:openwindow(\'/includes/commentForm.php?servicio='.$umbrales['servicio_id'].'&umbral_id='.$umbrales['id'].'&id='.$row['id'].'\')">'.round($row['valor'], 3).'</a>
            </td>
            ';
        }
    }
    sqlsrv_free_stmt($sqlQuery);
    sqlsrv_close($conn);
}
4

2 に答える 2

1

最初のクエリで、Umbrales テーブルを含む 1 つのクエリを実行できますか? あなたがやっている方法では、最初のクエリで取得したすべての行に対してトランザクションを呼び出しています。もう 1 つの方法では、結果に対して 1 つのトランザクションのみを実行します。

于 2012-12-03T20:37:19.847 に答える
0

解決策を見つけました...速度の向上は今のところ受け入れられます...

    $sqlQuery = sqlsrv_query($conn, "
        SELECT TOP ".OPT_RESULTADOS_MAXIMOS."
            bs.id AS valor_id,
            bs.valor AS valor,
            bs.servicio_id,
            u.id AS umbral_id,
            u.minimo AS media,
            uok.minimo AS media_ok
        FROM
            [Banksphere] bs
        INNER JOIN
            Umbrales u
        ON
            u.entidad_id = bs.entidad_id
        AND
            u.servicio_id = bs.servicio_id
        AND
            u.dia_id = bs.dia_id
        AND
            u.hora_id = bs.hora_id
        AND
            u.peticion_id = bs.peticion_id
        INNER JOIN
            Umbrales uok
        ON
            uok.entidad_id = bs.entidad_id
        AND
            uok.servicio_id = bs.servicio_id
        AND
            uok.dia_id = bs.dia_id
        AND
            uok.hora_id = bs.hora_id
        AND
            uok.peticion_id = '0'
        WHERE
            bs.entidad_id = '$entidad_id'
        AND
            bs.servicio_id = '$servicio_id'
        AND
            bs.peticion_id = '$peticion_id'
        AND
            bs.fecha = '$fecha'
        ORDER BY
            bs.hora_id DESC,
            bs.peticion_id ASC
    ");
于 2012-12-04T16:06:14.390 に答える