Ver Mensaje Individual
  #3 (permalink)  
Antiguo 02/05/2008, 17:03
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 2 meses
Puntos: 85
Re: Entre mas campos hayan en el WHERE mas rapida es la consulta?

Hola,

En primer lugar, la cantidad de condiciones que existan en el where tiene que ver con la informacion que se quiere obtener de la base de datos y no con la velocidad de la consulta, es un cuestion de logica de conjuntos (intersecciones, uniones, nulo o vacio, diferente de, igual que, etc), pero si tiene un impacto en la velocidad, la idea es comentar que se puede hacer al respecto.

Rows: es la cantidad de registros que cumplen con las condiciones.
Bytes: es el peso en bytes de los registros que cumplen con las condiciones.
Cost: es el costo de la consulta segun el optimizador.

En el primer caso tengo un solo filtro, status = 'VALID'

Código:
SQL> explain plan for
  2  select object_name from t1 where status = 'VALID';

--------------------------------------------------------------------------
| Id  | Operation	  | Name | Rows  | Bytes | Cost (%CPU)| Time	 |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	 | 19680 |   615K|   129   (4)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| T1	 | 19680 |   615K|   129   (4)| 00:00:02 |
--------------------------------------------------------------------------
En el segundo caso tengo dos condiciones, donde mantengo la primera y agrego una mas, en este caso la cantidad de filas se fue a poco mas de la mitad pero tuve un incremento en el costo de cpu para obtener los datos, hasta aqui se podria intuir el trabajo adicional de evaluar una segunda condicion.

Código:
SQL> explain plan for
  2   select object_name from t1 where status = 'VALID' and temporary = 'N';

--------------------------------------------------------------------------
| Id  | Operation	  | Name | Rows  | Bytes | Cost (%CPU)| Time	 |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |	 |  9840 |   326K|   130   (5)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| T1	 |  9840 |   326K|   130   (5)| 00:00:02 |
--------------------------------------------------------------------------
En el ultimo caso, agrego una tercera condicion, manteniendo las primeras dos, pero el costo de cpu se fue al minimo, esto es porque el acceso a la tabla se hace a traves de un indice creado sobre el campo object_id.

Código:
SQL> explain plan for
  2   select object_name from t1 where status = 'VALID' and temporary = 'N' and object_id = 15;

-------------------------------------------------------------------------------------------
| Id  | Operation		    | Name	  | Rows  | Bytes | Cost (%CPU)| Time	  |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	    |		  |	1 |    39 |	2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS BY INDEX ROWID| T1	  |	1 |    39 |	2   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN	    | IND_T1_O_ID |	1 |	  |	1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
En conclusion, no es tanto la cantidad de condiciones del where, si no, como accede la base de datos a las filas de las tablas. Lo que hay que tener es un buen modelo de datos con sus respectivos indices, y dejar los filtros de las consultas para el modelo logico.

Saludos

Última edición por matanga; 07/05/2008 a las 02:04 Razón: fe de errata