Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 13-05-2008
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 24
mlara Va por buen camino
Vamos mejorando... a ver hasta donde llego.

Esta es la consulta planteada:

Código SQL [-]
SELECT * FROM "Tabla1" WHERE "Campo1" || "Campo2" IN (
SELECT DISTINCT "Cod1" || "Cod2" FROM "Tabla2" WHERE ...
)

"Campo1" + "Campo2" deben estar dentro del conjunto de resultados, parejas diferentes compuestas por "Cod1" + "Cod2".

Si tengo un índice sobre "Tabla2" conformado por los campos "Cod1" y "Cod2", yo espero que el sistema use el índice. Al ejecutar la consulta veo que el plan adoptado realiza un ordenamiento "natural" (<natural_scan>), por lo que intento lo siguiente:

Código SQL [-]
SELECT * FROM "Tabla1" WHERE "Campo1" || "Campo2" IN (
SELECT DISTINCT "Cod1" || "Cod2" FROM "Tabla2" WHERE ...
PLAN ("Tabla2" INDEX ("Tabla2_Cod1Cod2"))
)

, en donde "Tabla2_Cod1Cod2" es el nombre del índice sobre dichos campos.

Entonces el sistema retorna el siguiente mensaje:

Cita:
index Tabla2_Cod1Cod2 cannot be used in the specified plan.
Entonces opto por cambiar la consulta de tal manera que no deba usar la concatenación (esto lo descubro después de hacer varias pruebas), de la siguiente manera:

Código SQL [-]
SELECT * FROM "Tabla1" T1 WHERE EXISTS (
SELECT * FROM "Tabla2" T2 WHERE (T1."Campo1" = T2."Cod1" AND T1."Campo2" = T2."Cod2") AND ...
)

y de esta manera, sin necesidad de especificar el plan, el sistema por sí sólo adopta el plan adecuado:

Cita:
PLAN (T2 INDEX (Tabla2_Cod1Cod2))
En mi consulta, que es en realidad un poco más "extensa" el tiempo de la consulta disminuyó de varios minutos a algunos segundos.

Aún así, el tiempo no me parece "adecuado". Debo seguir trabajando... mmm

Curioso

La primera consulta en Paradox sólo tomaba un par de segundos. La segunda consulta, usando EXISTS, llevó el uso del procesador al 100% y demoró varios minutos. Contrario a lo que sucede en Firebird. Aunque en Firebird la primera consulta demoraba en realidad demasiados minutos.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.

Última edición por mlara fecha: 13-05-2008 a las 10:08:30.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Transaccion con if y con exists zvf SQL 4 18-09-2007 18:52:44
Microsoft declara que Vista tiene problemas muy serios Casimiro Noteví Noticias 16 30-01-2007 09:44:12
Error A component Named Matri already Exists janlo Varios 5 28-07-2006 07:16:39
Error en el Exists Payola2011 MySQL 7 31-01-2006 19:17:47
-502 Declared cursor already exists Carlitos Firebird e Interbase 4 30-09-2003 17:18:22


La franja horaria es GMT +2. Ahora son las 22:09:25.


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