[英]PHP SQLSRV query very slow
用全功能代碼更新
我正在IIS 7.5上運行PHP以連接到托管在另一台服務器上的SQL Server數據庫...
我的網頁可以正常運行,但是執行這樣的簡單查詢需要花費很多時間...每個循環僅返回(12 * 3)* n個結果,這些循環在foreach“ servicio_id”內給出,其中n =服務數量我有...一個簡單的頁面必須返回我:((12 * 3)* 14)* 3個結果...我將解釋:((12 * 3)*服務)*表格數量(銀行領域和遮陽傘* 2就像您將看到的...)
我認為問題出在表上,因為我幾乎有200萬行,而且每天增加大約20.000行……但是我認為運行查詢不會花那么長時間,因為我指定了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);
}
您能否在第一個查詢中執行一個包含Umbrales表的查詢? 這樣做的方式是,您在第一個查詢中獲得的每一行都會調用一個事務。 另一種方法是,您只用結果執行一次事務。
得到了解決方案...現在速度提高是可以接受的...
$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
");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.