cancel
Showing results for 
Search instead for 
Did you mean: 

Consejos para mejor una Consulta

0 Kudos

Saludos Compañeros, mencionarles que actualmente estoy desarrollando el siguiente query, el query me funciona y me da todos los resultados que yo quiero, pero lo que me preocupa es que puede consumir varios recursos de la base de datos volviendo lento el proceso y ademas perjudicar a los demás usuarios.

SELECT

T1.[ItemCode],

T1.[Dscription],

sum(T1.Quantity) as Cantidad,

T1.WhsCode,

CASE WHEN left(T6.SeriesName,2)='LP' THEN 'LA PAZ'

         WHEN left(T6.SeriesName,2)='CB' THEN 'COCHABAMBA'

         WHEN left(T6.SeriesName,2)='EA' THEN 'EL ALTO'

         WHEN left(T6.SeriesName,2)='OR' THEN 'ORURO'

         WHEN left(T6.SeriesName,2)='PD' THEN 'PANDO'

         WHEN left(T6.SeriesName,2)='BE' THEN 'BENI'

         WHEN left(T6.SeriesName,2)='PT' THEN 'POTOSI'

         WHEN left(T6.SeriesName,2)='SC' THEN 'SANTA CRUZ'

         WHEN left(T6.SeriesName,2)='SU' THEN 'SUCRE'

         WHEN left(T6.SeriesName,2)='TA' THEN 'TARIJA'

         WHEN left(T6.SeriesName,2)='ZF' THEN 'ZONA FRANCA'

END as REGIONAL,

CASE WHEN left(T6.SeriesName,2)='LP' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='CB' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='EA' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='OR' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='PD' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='BE' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='PT' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='SC' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='SU' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='TA' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='ZF' THEN sum(((CASE WHEN T1.TreeType='N' AND T5.U_ClaseProducto = '0004' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         ELSE NULL END AS 'MERCADO PRIVADO',

CASE WHEN left(T6.SeriesName,2)='LP' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='CB' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='EA' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='OR' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='PD' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='BE' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='PT' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='SC' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='SU' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

         WHEN left(T6.SeriesName,2)='TA' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

        WHEN left(T6.SeriesName,2)='ZF' AND T5.U_ClaseProducto = '0003' THEN sum(((CASE WHEN T1.TreeType='N' THEN  T1.PRICEAFVAT ELSE P10.PRICEAFVAT end) * T1.QUANTITY))

        ELSE NULL END AS 'COSMETICOS'

FROM

OINV T0  INNER JOIN INV1 T1 ON  T0.DocEntry = T1.DocEntry

left join (select t10.docentry, t10.linenum+2 'Linenum2', 'venta' 'tipo',T10.PRICEAFVAT, t10.treetype  from inv1 t10 where t10.treetype ='S') P10 on P10.docentry = t0.docentry and P10.Linenum2 = t1.linenum+1

inner join OITM T5 ON T5.ItemCode = T1.ItemCode

inner join NNM1 T6 ON T0.Series = T6.Series

WHERE t1.treetype in ('N','I')

and t0.U_ESTADOFC='v'  AND T1.[TargetType]<>'14'

and t0.docdate between '01/01/2013'  and '31/01/2013'

and (T1.priceafvat > 0 or TIPO = 'venta')

GROUP BY T1.ItemCode, T1.DSCRIPTION, T6.SeriesName, T1.WhsCode, t5.U_ClaseProducto

order by REGIONAL asc, t1.ItemCode asc

Como han podido ver en el query utilizo mucho el CASE y todavia me falta utilizar mas, porque tengo que mostrar por Regional y por cada regional debo mostrar la clase de producto, es decir T5.U_ClaseProducto desde el 0001 hasta el 0009.

Quisiera saber si existe una forma de mejorar o disminuir el query, para hacer mas veloz al reporte. Algunos consejos que me puedan dar para mejorar mis consultas????? si talvez el uso excesivo de los CASE es bueno o malo???  Alguna pagina o libro talvez????

Espero me puedan ayudar una vez mas, agradecerles de antemano

Un Saludo.

R.Calle

Accepted Solutions (1)

Accepted Solutions (1)

former_member218171
Participant
0 Kudos

Hola Raul,

La optimizacion de consultas es algo muy complicado pero debes enfocarte mas en la parte del WHERE y no tanto en los campos que necesitas desplegar. Tambien es fundamental ver si necesitas crear indices y que las estadisticas esten actualizadas. A nivel de SAP tienes una transaccion que se llama DBACOCKPIT, que te puede ayudar a analizar las consultas. DBACOCKPIT -> PERFORMANCE -> SQL STATEMENT ANALYSIS -> SHARED CURSOR CACHE, puedes seleccionar filtros y te va desplegar los querys que se han ejecutado luego escoges el que necesitas y le das en la opcion EXPLAIN para que te muestre como lo analiza la base de datos y los costos.

No se si tengas Oracle pero si tienes la version Enterprise, te recomiendo usar el Tuning Advisor el cual te genera opciones para mejorar considerablemente las consultas.

Saludos!

0 Kudos

Gracias Bernard por la respuesta, actualmente estoy utilizando el SAP Business One 8.82 y el gestor de Base de Datos SQL Server 2008 R2.

Estaba revisando del cockpit y quería preguntar algo mas, en la version 8.8 el cockpit es distinto y yo estoy trabajando sobre una base de datos de prueba y nose si activo el cockpit afectara a los demas usuarios que utilizan la base de datos de prueba, porque estoy usando el usuario de mi jefa que tiene permiso a todo.

Una vez mas muchas gracias por la respuesta.

Saludos.

former_member218171
Participant
0 Kudos

El DBACOCKPIT no afecta el performance de tu base de datos ya que solo interpreta la informacion recopilada anteriormente. Si estas usando SQLSERVER tambien puedes usar la herramienta Database Engine Tuning Advisor.

Saludos!

Answers (1)

Answers (1)

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado Raul.

La otra alternativa es que generes una vista con tu query y luego hagas los select apuntando a la vista.

Así, la vista solo cargará datos cuando hayan nuevos registros.

Saludos

FLR