PDA

Ver la Versión Completa : realizar consulta sin obtener resultados es muy lenta


erickperez6
06-03-2013, 05:26:36
Saludos,

Un tips que conozco para realizar una consulta sin traer resultados (util en algunos casos especiales, como activar datasets en blanco) es agregando un where 1 = 2 a la sentencia select. Ejm:

select * from empleados where 1 = 2

Funciona de maravilla hasta que me tope con una tabla que posee unos 4 millones de registro, esta consulta tarda casi 20 segundos en completarse. En fin, resolvi el caso buscando por un campo primario un código obviamente inexistente. Ejm:

select * from empleados where codigo = 0

Mi pregunta es por que tarda el 1 = 2? que esta analizando el gestor? 1 = 2 no son iguales, no hay que buscar nada, debería de traer la consulta inmediatamente. :confused:

Casimiro Notevi
06-03-2013, 11:26:31
Seguramente si miras el "plan execute" verás que ha recorrido todos los registros secuencialmente, por esa tarda.

De todas formas no entiendo el motivo de hacer eso, o sea, no entiendo eso de "activar dataset en blanco", ¿a qué te refieres?

Al González
06-03-2013, 19:26:41
Seguramente si miras el "plan execute" verás que ha recorrido todos los registros secuencialmente
¡Cierto! ^\||/

He hecho una prueba similar a la de Erick y pasa lo que él dice. Una explicación lógica es que al no aparecer en la cláusula Where ningún campo indexado, Firebird usa de forma predeterminada el plan Natural. Por tanto hay que usar un campo indexado, como Codigo.

No estoy seguro de que deba ocurrir, pero puede que alguna de las nuevas versiones de Firebird vengan con optimización para "consultas obvias". :)

[...] no entiendo el motivo de hacer eso, o sea, no entiendo eso de "activar dataset en blanco" [...]
Me parece que Erick se refiere a una consulta para obtener solamente los metadatos. Por cierto, eso mismo se consigue, sin necesidad de usar Where, cuando trabajas con cursores unidireccionales (como DBX) y TClientDataSet, y pones la propiedad PacketRecords de éste en 0:
To retrieve the metadata for a dataset, set PacketRecords to 0. When PacketRecords is zero, the provider returns only information from its dataset that defines the database’s structure, such as table, column, constraint, and domain definitions.