on 08-19-2013 3:05 PM
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
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!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
107 | |
12 | |
11 | |
6 | |
6 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.