2012-12-03 118 views
0

全功能代碼PHP SQLSRV查詢很慢

我運行在IIS 7.5 PHP連接到SQL Server數據庫,在另一個服務器託管...

已更新我有我的網頁完全工作,但它需要年齡來執行這樣簡單的查詢......它每個循環只返回(12 * 3)* n結果,循環在foreach「servicio_id」裏給出,其中n =我有的服務數量。 。((12 * 3)* 14)* 3結果...我會解釋: ((12 * 3)* SERVICES)*表格數量(Banksphere和Umbrales * 2喜歡你將會看到...)

我認爲問題出現在表中,因爲我有近200萬行,每天增加大約20000行...但是我認爲運行查詢不需要那麼長時間,因爲我指定了參數像entidad_id,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); 
} 

回答

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 
    "); 
1

您可以在第一個查詢中執行一個包含Umbrales表的查詢嗎?你這樣做的方式是,你爲第一個查詢中的每一行調用一個事務。另一種方式,你只能用結果進行一次交易。

+0

的事情是,我需要檢索Umbrales表中的一些值,從Banksphere查詢結果的* _id ..那麼,我該如何處理它呢? –

+0

我已更新我的代碼,現在您可以看到我正在嘗試執行的操作。 –

+0

您可以在第一個查詢中採用所有這些字段。我認爲這就是你現在在解決方案上所做的。 – mrq