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

query lenta

Estas en el tema de query lenta en el foro de Oracle en Foros del Web. Muy buenas! tengo un problema con unas consultas que al ejecutarlas tarda bastante en mostrar el resultado . Algunas de esas columnas tienen sus indices ...
  #1 (permalink)  
Antiguo 15/05/2013, 05:07
 
Fecha de Ingreso: abril-2013
Mensajes: 20
Antigüedad: 11 años, 6 meses
Puntos: 1
query lenta

Muy buenas! tengo un problema con unas consultas que al ejecutarlas tarda bastante en mostrar el resultado . Algunas de esas columnas tienen sus indices asignados. Pruebo a hacer la consulta de tres modos diferentes pero funciona de igual lentitud.
Código SQL:
Ver original
  1. SELECT "msisdn", "status", "optin_date", "optout_date",
  2.  (trunc("optout_date")-trunc("optin_date")) AS "life"
  3. FROM "subscriber"
  4. WHERE "status" = 0
  5. UNION ALL
  6. SELECT "msisdn", "status", "optin_date", "optout_date",
  7.  (trunc(sysdate)-trunc("optin_date")) AS "life"
  8. FROM "subscriber"
  9. WHERE "status" = 1;

Código SQL:
Ver original
  1. SELECT "msisdn", "status", "optin_date", "optout_date",
  2. CASE "status" WHEN 0 THEN (trunc("optout_date")-trunc("optin_date"))
  3. WHEN 1 THEN (trunc(sysdate)-trunc("optin_date"))
  4. END AS "life"
  5. FROM "subscriber";
Código SQL:
Ver original
  1. SELECT "msisdn", "status", "optin_date", "optout_date",
  2. decode ("status", 0 , (trunc("optout_date")-trunc("optin_date")) ,
  3.     1 , (trunc(sysdate)-trunc("optin_date")) ) AS "life"
  4. FROM "subscriber";


esta es la tabla (subscriber):


Código SQL:
Ver original
  1. Name                                                                                                                                                                          NULL?    TYPE
  2.  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  3.  id                                                                                                                                                                               NOT NULL NUMBER(11)
  4.  id_user                                                                                                                                                                          NOT NULL NUMBER(11)
  5.  id_service                                                                                                                                                                       NOT NULL NUMBER(11)
  6.  msisdn                                                                                                                                                                           NOT NULL NUMBER(20)
  7.  nextbill                                                                                                                                                                         NOT NULL DATE
  8.  credits                                                                                                                                                                          NOT NULL NUMBER(11)
  9.  failed_trys                                                                                                                                                                      NOT NULL NUMBER(11)
  10.  last_attempt                                                                                                                                                                      DATE
  11.  STATUS                                                                                                                                                                           NOT NULL NUMBER(4)
  12.  optin_date                                                                                                                                                                       NOT NULL DATE
  13.  optout_date                                                                                                                                                                       DATE
  14.  id_source                                                                                                                                                                      NOT NULL NUMBER(11)
  15.  id_campaign                                                                                                                                                                  NOT NULL NUMBER(20)
  16.  id_campaign_detail_promo_sms                                                                                                                                      NOT NULL NUMBER(20)

alguien que pueda dar algún consejo de optimizacion ??

gracias!!

Última edición por gnzsoloyo; 15/05/2013 a las 05:24 Razón: SQL sin etiquetar. Usar Highlight "SQL"
  #2 (permalink)  
Antiguo 15/05/2013, 05:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: query lenta

Cita:
Algunas de esas columnas tienen sus indices asignados
Primer consejo: Si usas un campo en el WHERE, asegurate que tenga un índice que sirva.
Hay dos cosas que seguro no debes hacer en campos indexados:
1) No generes un índice sobre un campo que tenga dos valores posibles (0/1, por ejemplo). Un campo de ese tipo en el mejor de los casos repartirá el 50% de los registros en cada entrada, por lo que el analizador de consultas de Oracle simplemente lo descartará y leerá la tabla.
2) Si tienes un campo DATE indexado, y los datos son de tipo Fecha y Hora (dd/mm/aaaa HH:mm:ss), no lo trunques si lo usas como parámetro del WHERE. Cuando lo haces, como el tipo comparado (fecha corta) es diferente al tipo declarado de la clave del indice (fecha larga), Oracle descarta el índice, y lee la tabla.

En esencia tu problema de lentitud parece ser causado porque al no haber parametrizaciones útiles, o relaciones que usen los índices, realiza un full table scan, que es la peor forma de consulta que exista, después del producto cartesiano.

Por cierto, en tu primera consulta, si el campo status es un flag de dos estados posibles, entonces no tiene ningún sentido hacer un UNION, porque generaría el mismo resultado que una consulta común, con el agregado de un ORDER BY sobre ese campo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/05/2013, 05:50
 
Fecha de Ingreso: abril-2013
Mensajes: 20
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: query lenta

Gracias por el aporte gnzsoloyo!

Al principio si que puso indice el status pero me di cuenta que no servia para nada ya que solo hay dos tipos de valores en la columna XD

En los campos date de momento no he añadido ningun indice ya que no sabia seguro si era necesario, el trunc lo pongo ya que si no me da un resultado con demasiados decimales y no quiero que me los muestre. ¿sabes algún modo mejor de hacer la query sin trunc pero que no muestre decimales?

saludos!!
  #4 (permalink)  
Antiguo 15/05/2013, 06:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: query lenta



Pruébalo así:
Código SQL:
Ver original
  1. SELECT
  2.     msisdn,
  3.     STATUS,
  4.     optin_date,
  5.     optout_date,
  6.     TRUNC(DECODE(STATUS, 0, (optout_date-optin_date), 1, (SYSDATE-optin_date), 0))life
  7.   FROM subscriber;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 15/05/2013, 15:49
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: query lenta

Un pequeño comentario......

Para el campo que tiene dos valores posibles, quizás sería útil un índice BITMAP y respecto al UNION ALL, si no recuerdo mal, Oracle no te resuelve las dos querys a la vez, te resuelve primero una y luego la otra
  #6 (permalink)  
Antiguo 16/05/2013, 08:00
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: query lenta

Si bien es cierto que un indice bitmap funciona bien para campos con poca repetición, también tendrías bastantes problemas si esta es una tabla transaccional.

Este tipo de indices son muy buenos para bodegas de datos, donde los cargues de datos no son muy frecuentes y las consultas son muchas. Pero si la tabla recibe o modifica registros muy seguido, esto conlleva a un recreate del indice cada que se haga un cambio en la tabla lo cual puede resultar bastante costoso.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 20/05/2013, 01:25
 
Fecha de Ingreso: abril-2013
Mensajes: 20
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: query lenta

gnzsoloyo he probado ha hacerla como me has dicho pero sigue funcionando lenta ... pero probando desd SQL la query es bastante rapida .. solo me ocurre si lo hago desde interfaz grafica ... probe ha crear un indice bitmap pero al ser mi version de oracle un standard edition no permite crear indices bitmap
  #8 (permalink)  
Antiguo 20/05/2013, 03:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: query lenta

Bueno, por lo que dices, no es un problema de la consulta, sino de la interfaz...

¿Qué interfaz usas para hacerla?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 20/05/2013, 09:25
 
Fecha de Ingreso: abril-2013
Mensajes: 20
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: query lenta

utilizo Navicat ... es una interfaz que me sirve para hacer realizar conexiones con bbdd de oracle, mySQL, postgreSQL, etc
  #10 (permalink)  
Antiguo 20/05/2013, 09:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: query lenta

Dices que por consola es rápida y por el navicat es lenta?
Esto es raro.
Se me ocurre que tengas un cuello de botella en el driver jdbc.
Mira si puedes actualizar el driver, depronto trabajas con una versión viejita y puede presentar algún bug.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: funcion, lenta, query, tabla
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 12:21.