PHP - Consulta sql tarda mucho desde PHP

   
Vista:

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 01/09/2014 21:40:20
Que tal, tengo un problema al momento de hacer un query por medio de php. La consulta saca un reporte por un margen de fechas, cuando se selecciona un rango menor de 1 dia y maximo 2 si se ejecuta sin problemas pero al seleccionar mas ya no lo hace y se queda trabado el formulario al llegar a su máximo tiempo de ejecución.
El query no esta mal ya que si lo hago desde mysql directamente tarda menos del tiempo maximo.

Donde podria estar el error?? Problemas del servidor?? Problemas de memoria del php?

Antes funcionaba sin problemas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Consulta sql tarda mucho desde PHP

Publicado por xve (5522 intervenciones) el 02/09/2014 07:44:59
Hola Angel, no nos comentas mucho... nos puedes mostrar la consulta? cuantos registros tiene la base de datos? Si desde phpmyadmin no tarda nada, puede ser que intentes cargar muchos registros en el formulario?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jon

Consulta sql tarda mucho desde PHP

Publicado por Jon (27 intervenciones) el 02/09/2014 14:10:33
Hola Angel.
Puedes estar cometiendo un error bien común en cuento haces una APP en PHP la cual es crear por cada sentencia una conexión nueva. este te genera un gran peso para tu APP o lo otro es que también es posible que previamente ya tengas un motor de MYSQL instalado en tu equipo por lo que el motor secundario ocupa parte mínima de la carga del equipo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 02/09/2014 16:10:47
Esto es el codigo de ventas.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<?
	include('include/header1.php');
	set_time_limit(0);
	ini_set('max_execution_time', 600);
  	ini_set('memory_limit', '1024M');
	$fechamax  = $db->get_row("SELECT MAX(fecha_transmision) as fecha FROM ventas");
	$fechamin  = $db->get_row("SELECT MIN(fecha_transmision) as fecha FROM ventas");
	$bar       = strtotime($fechamax->fecha); $candy = strtotime('-1 month',$bar);
	$separa    = date('Y-m-d', $candy);
	$fechamax1 = str_replace('-', ', ', $separa);
	$bar1      = strtotime($fechamin->fecha); $candy1 = strtotime('-1 month',$bar1);
	$separa1   = date('Y-m-d', $candy1);
	$fechamin1 = str_replace('-', ', ', $separa1);
?>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Alsuper - Proveedores</title>
  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
  <link rel="stylesheet" type="text/css" href="css/theme/easyui.css">
  <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
  <script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
  <script type="text/javascript" src="js/curvycorners.js"></script>
  <script type="text/javascript">
 
  jQuery(document).ready(function($) {
  	caldenario();
  	$('#exportar').on('click',exportar);
  	$('#Exportar_a_Excel tr:nth-child(odd)').addClass('odd1');
	$('#Exportar_a_Excel tr:nth-child(even)').addClass('even1');
  });
  function caldenario(){
  	$.datepicker.regional['es'] = {
		closeText: 'Cerrar',
		prevText: '&#x3c;Ant',
		nextText: 'Sig&#x3e;',
		currentText: 'Hoy',
		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'],
		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
		weekHeader: 'Sm',
		dateFormat: 'dd-mm-yy',
		firstDay: 1,
		isRTL: false,
		showMonthAfterYear: false,
		yearSuffix: ''
	};
	$.datepicker.setDefaults($.datepicker.regional['es']);
 
	$(".datepicker").datepicker({
		showOn: 'button',
		buttonImageOnly: true,
		buttonImage: 'img/calendario.jpeg',
		minDate: new Date(<? print $fechamin1; ?>),
	    maxDate: new Date(<? print $fechamax1; ?>),
	    constrainInput: true,
		showAnim: "scale",
		showOn: "both",
		showOptions: {
	           origin: ["top", "left"]
	      }
	});
  }
  function exportar(){
			$("#datos_a_enviar").val( $("<div>").append( $("#Exportar_a_Excel").eq(0).clone()).html());
			$("#FormularioExportacion").submit();
	  }
 
  </script>
  <?
  if(!empty($_POST)){
		$arreglo = array(
			'proveedor'			=>	$_POST['proveedor'],
			'descripcion' 		=>	$_POST['descripcion'],
			'fechade' 			=>	$_POST['fechade'],
			'fechaa' 			=>	$_POST['fechaa'],
			'sucursal' 			=>	$_POST['sucursal'],
			'codigo' 			=>	$_POST['codigo'],
			'cantidadde' 		=>	$_POST['cantidadde'],
			'cantidada' 		=>	$_POST['cantidada'],
			'importede' 		=>	$_POST['importede'],
			'importea' 			=>	$_POST['importea'],
			'tecla' 			=> 	$_POST['tecla'],
		);
		$ventas1 = getVentas($arreglo);
	}
	?>
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
<div align="center">
  <table id="content">
    <tr>
      <td height="19" align="center" valign="top">
        <img src="img/top_prov.jpg" width="715" height="110">
        <div class="prov_ventana_info">
        	Favor de Incluir en su facturación la siguiente información  <br>
        	<b>Banco:</b> <?=$_SESSION["nom_banco"]?> <br>
        	<b>No. de Cuenta:</b> <?=$_SESSION["num_cuenta"]?> <br>
        	<b>Tipo de Pago:</b> <?=$_SESSION["tipo_pago"]?>  - <a href="formapago.php">ver completo</a><br>
        </div>
      </td>
    </tr>
    <tr>
      <td align="center" valign="top">
      <table width="710" border="0" cellpadding="0" cellspacing="0" bordercolor="#CCCCCC">
        <tr>
          <td>
              <ul class="tabs123 group">
                <li><a href="existencias.php" >Existencias</a></li>
                <li class="active rounded"><a href="ventas.php">Ventas</a></li>
                <li><a href="ordenesdecompra.php" >Ordenes de Compra</a></li>
                <li><a href="cheques.php" >Cheques</a></li>
                <li><a href="promocontrol.php" >Promocontrol</a></li>
                <li><a href="usuario.php">Usuarios</a></li>
                <li><a href="salir.php" >Salir</a></li>
              </ul>
          </td>
        </tr>
		<?
			$bar = strtotime($fechamax->fecha);
			$newMax1 =  date('d-m-Y', $bar);
			$bar2 = strtotime($fechamin->fecha);
			$newMin1 =  date('d-m-Y', $bar2);
		?>
      <tr>
        <td height="38" colspan="10" align="left" valign="top" bordercolor="#2B659A" >
          <table width="100%" border="0" cellpadding="0" cellspacing="0" class="tablatext">
            <tr>
            <td width="2%" align="left" valign="top" bgcolor="#FFFFFF"></td>
	            <td width="95%" bgcolor="#FFFFFF" style="padding-top:4px;">
	              <div class="Estilo1">
				    <form method="post" action='<?=$_SERVER['PHP_SELF']?>'>
				    		<input type="hidden" value="<?=$_SESSION["proveedor"]?>" name="proveedor" id="formProveedor">
				    	<div style="float: left; ">
				    		Descripcion:
				    		<input type="text" name="descripcion" id="descripcion" size="10">
				    		Fecha de:
				    		<input id="formFechade" class="datepicker" name="fechade" value="<?=$newMin1?>" size="8" maxlength="10">
				    		 a
				    		<input id="formFechaa" class="datepicker" name="fechaa" value="<?=$newMax1?>" size="8" maxlength="10">
				    		Suc:
				    		<select id="formSucursal" style="width:100px" name="sucursal">
				    				<option value="0" selected>Todas</option>
					    			<?
					    				foreach (getSucursales() as $res){
					    			?>
				    					<option value="<?=$res->sucursal?>"><?=$res->sucursal?>-<?=$res->descripcion?></option>
				    				<? } ?>
				    		</select>
							Tecla
				    		<input type="text" id="formTecla" name="tecla" size="3">
				    		<br>
				    		Codigo
				    		<input type="text" id="formCodigo" name="codigo" size="7">
				    		Cantidad entre
				    		<input type="text" id="formCantidadde" name="cantidadde" size="2">
				    		y
				    		<input type="text" id="formCantidada" name="cantidada" size="2">
				    		Importe entre
				    		<input type="text" id="formImportede" name="importede" size="2">
				    		y
				    		<input type="text" id="formImportea" name="importea" size="2">
				    		<input type="submit" value="Buscar" id="buscarVentas">
				    		<input type="button" value="Exportar" id="exportar">
						</div>
				    </form>
				    <form method="post"  target="_blank" action="datos/creaexcel.php" id="FormularioExportacion">
				    	<input type="hidden" id="datos_a_enviar" name="datos_a_enviar" />
				    </form>
				    <div style="margin-bottom: 20px;">
				    	<table id="existenciasDataGrid" align="left"></table>
					</div>
	              </div>
	          	</td>
	            <td width="3%" align="right" valign="top" bgcolor="#FFFFFF">
	            </td>
            </tr>
            <tr>
	            <td colspan="3" bgcolor="#FFFFFF">
	            	<div class="scroll" id="divtable">
		            	<table width="1800px" border="0" id="Exportar_a_Excel">
						  <tr class="cabezera">
						    <td>Sucursal</td>
						    <td width="145px">Nombre Sucursal</td>
						    <td>Articulo</td>
						    <td>Codigo</td>
						    <td width="370px">Nombre Articulo</td>
						    <td>Venta Actual</td>
						    <td>Cantidad Actual</td>
						    <td>Importe Actual</td>
						    <td>Venta Mes Anterior</td>
						    <td>Cantidad  Mes Anterior</td>
						    <td>Importe  Mes Anterior</td>
						    <td>Venta Año Anterior</td>
						    <td>Cantidad Año Anterior</td>
						    <td>Importe Año Anterior</td>
						    <td width="170px">Fecha</td>
						  </tr>
						  <?
						  	if(!empty($ventas1)){
						  		$ventas1 = json_decode($ventas1,true);
						  		$cantidad = count($ventas1);
						  		for ($i=0; $i < $cantidad; $i++) {
						  			echo "<tr>";
										echo "<td>".$ventas1[$i]['sucursal']."</td>";
										echo "<td>".$ventas1[$i]['descripcion']."</td>";
										echo "<td>".$ventas1[$i]['articulo']."</td>";
										echo "<td>".$ventas1[$i]['codigo']."</td>";
										echo "<td>".$ventas1[$i]['nombre']."</td>";
										echo "<td>".$ventas1[$i]['venta']."</td>";
										echo "<td>".$ventas1[$i]['cantidad']."</td>";
										echo "<td>".$ventas1[$i]['importe']."</td>";
										echo "<td>".$ventas1[$i]['MaVenta']."</td>";
										echo "<td>".$ventas1[$i]['MaCantidad']."</td>";
										echo "<td>".$ventas1[$i]['MaImporte']."</td>";
										echo "<td>".$ventas1[$i]['AaVenta']."</td>";
										echo "<td>".$ventas1[$i]['AaCantidad']."</td>";
										echo "<td>".$ventas1[$i]['AaImporte']."</td>";
										echo "<td>".$_POST['fechade']." a ".$_POST['fechaa']."</td>";
									echo "</tr>";
						  		}
						  	}
						  ?>
						</table>
					<div>
	            </td>
            </tr>
          </table>
      <tr>
<?
	include('include/footer.php');
?>

El footer.php no tiene nada relevante, pero el header.php tiene un include de funciones.php, en el cual esta el metodo getVentas que aqui pongo tambien.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function getVentas($parametros){
		global $db;
		$proveedor   =	$parametros['proveedor'];
		$descripcion =	$parametros['descripcion'];
		$fechade     =	$parametros['fechade'];
		$fechaa      =	$parametros['fechaa'];
		$sucursal    =	$parametros['sucursal'];
		$codigo      =	$parametros['codigo'];
		$cantidadde  =	$parametros['cantidadde'];
		$cantidada   =	$parametros['cantidada'];
		$importede   =	$parametros['importede'];
		$importea    =	$parametros['importea'];
		$tecla       =	$parametros['tecla'];
 
		$fecha = explode('-', $fechade);
		$fecha1 = $fecha[2].'-'.$fecha[1].'-'.$fecha[0];
 
		$fecha = explode('-', $fechaa);
		$fecha2 = $fecha[2].'-'.$fecha[1].'-'.$fecha[0];
 
 
		if(!empty($descripcion)){
			$where1 .=" AND a.nombre LIKE '%$descripcion%'";
		}
		if(!empty($codigo)){
			$where1 .=" AND a.codigo = $codigo";
		}
		if(!empty($tecla)){
			$where1 .=" AND a.tecla = $tecla";
		}
 
 
		if($sucursal != 0){
			$where .=" AND v.sucursal = $sucursal";
		}
		if($cantidadde!='') {
			if($cantidada!='') {
				$having =" HAVING SUM(Cantidad) BETWEEN '$cantidadde' AND '$cantidada' ";
			} else {
				$having =" HAVING SUM(Cantidad)>='$cantidada' ";
			}
		} elseif($cantidadde!='') {
			$having =" HAVING SUM(Cantidad)<='$cantidada' ";
		}
 
		if($importede!='') {
			if($importea!='') {
				if(empty($having)){
					$having .= " HAVING SUM(Venta*Cantidad) BETWEEN $importede AND $importea ";
				} else {  $having .= " AND SUM(Venta*Cantidad) BETWEEN $importede AND $importea ";
			}
			} else {
				if(empty($having)){
					$having .= " HAVING SUM(Venta*Cantidad)>=$importede ";
				} else {
					$having .= " AND SUM(Venta*Cantidad)>=$importede ";
				}
			}
		} elseif($importea!='') {
			if(empty($having)){
				$having .=" HAVING SUM(Venta*Cantidad)<=$importea ";
			} else {
				$having .= " AND SUM(Venta*Cantidad)>=$importede ";
			}
		}
		$query1 ="	CREATE TEMPORARY TABLE paso
					SELECT 	ap.proveedor,ap.articulo,a.nombre,a.tecla,a.codigo
					FROM 	arti_proveedor ap
							INNER JOIN articulo a ON ap.articulo=a.articulo
					WHERE 	ap.proveedor=$proveedor
					".$where1."
				";
		$db->query($query1);
 
		$query2 =" SELECT 	v.sucursal, v.articulo,p.nombre,p.tecla,p.codigo,s.descripcion,
							ROUND(SUM(Cantidad),2) AS cantidad,
							ROUND(SUM(Venta*Cantidad)/SUM(Cantidad),2) AS venta,
							ROUND(SUM(Venta*Cantidad),2) AS importe,
							ROUND(SUM(MaVenta*MaCantidad)/SUM(MaCantidad),2) AS MaVenta,
							ROUND(SUM(MaCantidad),2) AS MaCantidad,
							ROUND(SUM(MaVenta*MaCantidad),2) AS MaImporte,
							ROUND(SUM(AaVenta*AaCantidad)/SUM(AaCantidad),2) AS AaVenta,
							ROUND(SUM(AaVenta*AaCantidad),2) AS AaImporte,
							ROUND(SUM(AaCantidad),2) AS AaCantidad
				  FROM 		ventas v
							INNER JOIN paso p ON v.articulo=p.articulo
							INNER JOIN sucursal s ON v.sucursal=s.sucursal
				  WHERE 	fecha_transmision BETWEEN '$fecha1' AND '$fecha2' AND p.proveedor=$proveedor
				  			AND v.sucursal NOT IN(95,96)
				  			".$where."
							GROUP BY v.sucursal,v.articulo
							".$having."
						 ";
 
		$respuesta = $db->get_results($query2);
		$query3 = "DROP TABLE paso";
		$db->query($query3);
		return json_encode($respuesta);
	}

Cuando hago la consulta por sql directamente, tarda aproximadamente unos 4 minutos y medio en un rango de 3 días y su tiempo de ejecución del script es de 300, no habría problema en mostrar el resultado pero se traba.

La base de datos lleva funcionando desde siempre en la empresa y jamas había presentado este error, actualmente los registros que hay en la base de datos son 9 millones, se están usando indices.
El formulario tiene un limite maximo de carga de registros??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 02/09/2014 16:31:22
Al hacer la consulta desde phpmyadmin, tarda 96 segundos en sacar tres dias, y desde sql yog 1 min 44 segundos.
Casi semejantes, estoy pensando que el problema sera la carga de datos en el php.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta sql tarda mucho desde PHP

Publicado por xve (5522 intervenciones) el 02/09/2014 20:33:15
Has revisado la consola de errores del navegador? no vaya a haber un error de javascript que detiene la carga de la pagina, o alguna cosa por el estilo.
Has probado con otro navegador?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 02/09/2014 21:16:49
Con ningun navegador funciona, y en la consola de javascript no muestra ningun error, de echo se queda en blanco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta sql tarda mucho desde PHP

Publicado por xve (5522 intervenciones) el 02/09/2014 21:30:40
En estos casos, y viendo que el problema es del código PHP, lo que yo haría es ir añadiendo exit(); en el código, para ver en que momento deja de funcionar.

La otra cosa que puede hacer, es revisar el log de Apache (o servidor web que utilices) para ver si da alguna información.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 02/09/2014 22:32:13
Se mostro esto en la consola cuando se traba:

POST http://proveedores.alsuper.com/proveedores/ventas.php net::ERR_INCOMPLETE_CHUNKED_ENCODING

Checando el error log da solo warnings, no da errores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta sql tarda mucho desde PHP

Publicado por xve (5522 intervenciones) el 03/09/2014 07:54:00
Hola Angel, la verdad es que nunca había visto este mensaje de error... he estado buscando, y no he encontrado una solución clara, parece ser mas un problema de Windows que del navegador.

Entiendo que estas utilizando Windows, porque todo lo que he encontrado hablan de limpiar el registro, desinstalar y volver a instalar el navegador, y incluso buscar virus... Entiendo, que por eso no te funciona con ningún navegador.

Estoy casi seguro, que lo pruebas con otro ordenador te funcionar perfectamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 03/09/2014 15:10:23
Y entonces el virus donde esta? En el servidor?
Ya que ninguna maquina cliente logra sacar ventas..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 03/09/2014 16:03:47
Disculpa, pero probar que? Abrir la app desde otro ordenador? Ya que si es así, todas las maquinas cliente experimentan este problema. O te refieres de montar la app en otro servidor.

Ayer monte la app en mi laptop, después de mucho batallar la hice que funcionara pero por una extraña razón las consultas me tardaban como 3 veces mas de lo normal, pero aquí la diferencia estaba en que si metía un rango de 3 días lo que no puedo hacer aquí si lo mostraba. Eso me abre de nuevo la interrogante, problemas con el php o con la conexión hacia el servidor? O en si, cambiar de host.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Consulta sql tarda mucho desde PHP

Publicado por xve (5522 intervenciones) el 03/09/2014 19:35:09
Hola Angel, pero esto es un pagina web, no? a la que la llamas desde un navegador, no? lo que yo digo, es que hagas la llamada a esa web desde otro ordenador, poniendo la ip o dominio de donde se encuentra tu web.

Esto lo digo, para probar que no sea problema de tu sistema operativo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sql tarda mucho desde PHP

Publicado por Angel (41 intervenciones) el 15/09/2014 22:23:17
No es del sistema operativo, pruebo desde un ipad o desde un cel con android y se traba de la misma forma, siempre en un rango mayor de 3 dias con cualquier proveedor. Ejemplo 01-03 si saca las ventas, pero ya ponerle hasta 04 se traba siempre. No se que pueda ser.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar