Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

optimizar sql

Estas en el tema de optimizar sql en el foro de Bases de Datos General en Foros del Web. Saludos compañeros, Os planteo el siguiente problema. Tengo dos tablas y quiero obtener a partir de una sentencia sql (oracle) que si en ninguna de ...
  #1 (permalink)  
Antiguo 14/08/2010, 09:18
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 2 meses
Puntos: 5
optimizar sql

Saludos compañeros,

Os planteo el siguiente problema. Tengo dos tablas y quiero obtener a partir de una sentencia sql (oracle) que si en ninguna de las dos hay registros dada una condición me devuelva un número diferente de cero. Explicándolo con un ejemplo:

tenemos las tablas A y B

No existen registros ni en la tabla A ni en la B --> resultado: (error) faltan registros (consulta devuelve valor diferente de cero)

Existen registro en A y B; Existen registros en A pero no en B; Existen registros en B pero no en A ---> resultado: (correcto) no faltan registros (consulta devuelve cero)

Tengo la select que funciona; pero no es optima

Código PHP:
SELECT
DECODE
(
    (
SELECT count(*)
        
FROM
            ALARMAS_USUARIOS ALUAUX
        WHERE
            ALUAUX
.IDEALP 1
        
AND ALUAUX.IDEALA 82
    
)
    +
    (    
    
SELECT count(*)
        
FROM
            ALARMAS_OFICINAS ALOAUX
        WHERE
            ALOAUX
.IDEALP 1
        
AND ALOAUX.IDEALA 82  
    
), 0,1,0
CONTIENE_REGISTROS
from dual 
He leído en esta página que:

Cita:
Para comprobar si existen registros para cierta condición, no se debe hacer un SELECT COUNT(*) FROM X WHERE xxx, sino que se hace un SELECT DISTINCT 1 FROM X WHERE xxx. De este modo evitamos al servidor que cuente los registros.
El problema es que si una de las consultas no tiene registros y no devuelve resultados hay casos en los que no me lo hace bien; podéis comprobar que algo sumado a null da null...

Código PHP:
elect 1+null from dual 
... y por tanto el decode no me lo hace bien.

¿alguien ve alguna alternativa mejor? Está claro que usando el count(*) me recorre toda la tabla y yo lo que quiero es que cuando se cumpla la condición de encontrar un registro, deje de recorrerla.

gracias!
  #2 (permalink)  
Antiguo 14/08/2010, 13:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: optimizar sql

Mi primera recomendación es hacer una función en PLSQL que haga la respectiva evaluación. Me parece una consulta demasiado compleja para un resultado tan simple.

Sin embargo utilzando case en vez de decode

Código SQL:
Ver original
  1. SELECT CASE    
  2.     WHEN
  3.     (    
  4.     SELECT COUNT(*)
  5.         FROM
  6.             ALARMAS_USUARIOS ALUAUX
  7.         WHERE
  8.             ALUAUX.IDEALP = 1
  9.         AND ALUAUX.IDEALA = 82
  10.     )
  11.     +
  12.     (    
  13.     SELECT COUNT(*)
  14.         FROM
  15.             ALARMAS_OFICINAS ALOAUX
  16.         WHERE
  17.             ALOAUX.IDEALP = 1
  18.         AND ALOAUX.IDEALA = 82
  19.     ) > 0
  20.     THEN
  21.         '0'
  22.     ELSE
  23.         '1'
  24.     END "CONTIENE REGISTROS"
  25. FROM dual;

He escuchado que el case es el reemplazo elegante de decode. en rendimiento puede ser mejor.

Nos cuentas
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:59.