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