Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   realizar consulta sin obtener resultados es muy lenta (https://www.clubdelphi.com/foros/showthread.php?t=82422)

erickperez6 06-03-2013 05:26:36

realizar consulta sin obtener resultados es muy lenta
 
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:
Código:

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:

Código:

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

Cita:

Empezado por Casimiro Notevi (Mensaje 456075)
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". :)

Cita:

Empezado por Casimiro Notevi (Mensaje 456075)
[...] 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:
Cita:

Empezado por la ayuda de Delphi
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.



La franja horaria es GMT +2. Ahora son las 04:15:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi