SQL - Mejora consulta SQL

   
Vista:

Mejora consulta SQL

Publicado por Jorge Cartagena (4 intervenciones) el 05/10/2015 19:13:37
Buenos dias por favor que me ayuden como puedo mejorar los tiempos de consulta de esta sentencia SQL, muchas gracias por su ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
SELECT PRODU_STOCK.cod_sec AS CODSECCION,
SECCION.seccion AS SECCION,
(SELECT TABLA.des_tab FROM TABLA WHERE TABLA.cod_tab=PRODU.depto AND TABLA.NUM_TAB=02) AS DEPARTAMENTO,
PRODU_STOCK.cod_pro AS COD_PROD,
PRODU.producto AS DESCRIPCION,
PRODU.refer AS REFERENCIA,
(SELECT TABLA.des_tab FROM TABLA WHERE TABLA.cod_tab=PRODU.cate AND TABLA.NUM_TAB=01) AS CATEGORIA,
(SELECT TABLA.des_tab FROM TABLA WHERE TABLA.cod_tab=PRODU.lineaprod AND TABLA.NUM_TAB=13) AS LINEAPROD,
PRODU.coleccion AS COLECCION,
(SELECT TABLA.des_tab FROM TABLA WHERE TABLA.cod_tab=PRODU.lineafac AND TABLA.NUM_TAB=713) AS GENERO,
PRODU.precio_vta AS PRECIOVTA,
(PRODU_STOCK.stock
+ isnull((SELECT SUM(cantidad) FROM IVTRATRA WHERE IVTRATRA.origen = PRODU_STOCK.cod_sec
AND IVTRATRA.cod_pro=PRODU_STOCK.cod_pro
AND IVTRATRA.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + "),0)
+ isnull((SELECT SUM(cantidad) FROM IVTRANOT WHERE IVTRANOT.cod_sec = PRODU_STOCK.cod_sec
AND IVTRANOT.cod_pro=PRODU_STOCK.cod_pro
AND IVTRANOT.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + "),0)
- isnull((SELECT SUM(cantidad) FROM IVTRATRA WHERE IVTRATRA.destino = PRODU_STOCK.cod_sec
AND IVTRATRA.cod_pro=PRODU_STOCK.cod_pro
AND IVTRATRA.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + "),0)
- isnull((SELECT SUM(cantidad) FROM IVTRACOM WHERE IVTRACOM.cod_sec = PRODU_STOCK.cod_sec
AND IVTRACOM.cod_pro=PRODU_STOCK.cod_pro
AND IVTRACOM.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + "),0)) AS INVINICIAL,
(SELECT SUM(cantidad)
FROM IVTRACOM
WHERE IVTRACOM.cod_sec = PRODU_STOCK.cod_sec
AND IVTRACOM.cod_pro=PRODU_STOCK.cod_pro
AND IVTRACOM.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + ") AS INGRESOSCOMPRA,
(SELECT SUM(cantidad)
FROM IVTRATRA
WHERE IVTRATRA.destino = PRODU_STOCK.cod_sec
AND IVTRATRA.cod_pro=PRODU_STOCK.cod_pro
AND IVTRATRA.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + ") AS INGRESOSTRANSF,
(SELECT SUM(cantidad)
FROM IVTRANOT
WHERE IVTRANOT.cod_sec = PRODU_STOCK.cod_sec
AND IVTRANOT.cod_pro=PRODU_STOCK.cod_pro
AND IVTRANOT.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + ") AS EGRESOSVENTA,
(SELECT SUM(cantidad)
FROM IVTRATRA
WHERE IVTRATRA.origen = PRODU_STOCK.cod_sec
AND IVTRATRA.cod_pro=PRODU_STOCK.cod_pro
AND IVTRATRA.fec_mov BETWEEN " + s_desde + " AND " + s_hasta + ") AS EGRESOSTRANSF,
PRODU_STOCK.stock AS INVFINAL,
(SELECT PRODU_STOCK.stock
FROM PRODU_STOCK
WHERE PRODU_STOCK.COD_PRO = PRODU.COD_PRO
AND PRODU_STOCK.COD_SEC='01')AS STOCKMATRIZ,
0 AS ROTACION
FROM PRODU_STOCK,
PRODU,
SECCION
WHERE PRODU_STOCK.cod_pro = PRODU.cod_pro
AND PRODU_STOCK.cod_sec=SECCION.cod_sec
AND PRODU_STOCK.cod_sec in(" + locales + ")
ORDER BY 1,2,3,4;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Mejora consulta SQL

Publicado por Isaias (690 intervenciones) el 05/10/2015 19:46:08
¿Cual es tu motor de base datos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mejora consulta SQL

Publicado por Jorge Cartagena (4 intervenciones) el 05/10/2015 19:47:40
SQL SERVER 2008r2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Mejora consulta SQL

Publicado por Isaias (690 intervenciones) el 05/10/2015 19:50:10
En SQL Server 2008 R2, cuentas con un servicio que se llama TUNING ADVISOR, donde puedes colocar tu consulta, pedir que la analice y que te sugiera mejoras, comunmente, te hara recomendaciones de INDICES y ESTADISTICOS.

El "problema" que veo de primera mano, es que tienes muchos SUBSELECTS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mejora consulta SQL

Publicado por Jorge Cartagena (4 intervenciones) el 05/10/2015 19:54:32
Si eso si me di cuenta pero no tengo idea como quitarlas y que se mejore la consulta, por ejemplo los campos de descripción que se obtienen de la tabla "TABLA", esos no los puedo quitar del subselect por que cada uno maneja una condición distinta, el campo INVINICIAL es el resultado de operaciones de los subselect de mas abajo los cuales no se como mejorarles :( por eso los tengo en subselect
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Mejora consulta SQL

Publicado por Isaias (690 intervenciones) el 05/10/2015 20:30:07
Debes colocarlos en un INNER JOIN con tu tabla principal. ¿Ya mandaste tu query al Tuning Advisor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mejora consulta SQL

Publicado por Jorge Cartagena (4 intervenciones) el 05/10/2015 21:48:48
Eso no se como realizarlo con INNER JOIN y si al analizar el QUERY en TUNING ADVISOR me da recomendaciones de INDICES que mejora el rendimiento en 92%. Corriendo el SQL en la base directo no se me demora, el problema es cuando mando a traer desde EXCEL la consulta, creo que voy a hacer un SP en el SQL que me almacene la consulta en una tabla temporal para del SQL leer solo esa tabla. O me puedes guiar como hacer la consulta con INNER JOIN???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Mejora consulta SQL

Publicado por Isaias (690 intervenciones) el 05/10/2015 22:31:12
Genera una vista y crea los indices
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Mejora consulta SQL

Publicado por Rafael (83 intervenciones) el 06/10/2015 12:51:35
Por mas de un motivo me es muy dificil probar esta modificación que te propongo...

Pero creo que si encapsulas mas el query y si tienes buenos indices seguro mejora simplemente por que haces 4 subqueries menos...

Tienes que revisarla pero estoy seguro que notaras la mejora de performance...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
SELECT CODSECCION
     , SECCION
	 , (SELECT TABLA.des_tab
		FROM   TABLA
		WHERE  TABLA.cod_tab = PRODU.depto
		AND    TABLA.NUM_TAB = 02) AS DEPARTAMENTO
	 , COD_PROD
	 , PRODU.producto AS DESCRIPCION
	 , PRODU.refer AS REFERENCIA
	 , (SELECT TABLA.des_tab
		FROM   TABLA
		WHERE  TABLA.cod_tab = PRODU.cate
	    AND    TABLA.NUM_TAB = 01) AS CATEGORIA
	 , (SELECT TABLA.des_tab
		FROM   TABLA
		WHERE  TABLA.cod_tab = PRODU.lineaprod
		AND    TABLA.NUM_TAB = 13) AS LINEAPROD
	 , PRODU.coleccion AS COLECCION
	 , (SELECT TABLA.des_tab
		FROM   TABLA
		WHERE  TABLA.cod_tab = PRODU.lineafac
		AND    TABLA.NUM_TAB = 713) AS GENERO
	 , PRODU.precio_vta AS PRECIOVTA
     , INVFINAL + EGRESOSTRANSF + EGRESOSVENTA - INGRESOSTRANSF - INGRESOSCOMPRA AS INVINICIAL
     , INGRESOSCOMPRA
     , INGRESOSTRANSF
     , EGRESOSVENTA
     , EGRESOSTRANSF
     , INVFINAL
     , STOCKMATRIZ
	 , 0 AS ROTACION
FROM   (SELECT PRODU_STOCK.cod_sec AS CODSECCION
             , SECCION.seccion AS SECCION
             , PRODU_STOCK.cod_pro AS COD_PROD
             , PRODU_STOCK.stock AS STOCK
             , (SELECT SUM(cantidad)
                FROM IVTRACOM
                WHERE IVTRACOM.cod_sec = PRODU_STOCK.cod_sec
                    AND IVTRACOM.cod_pro = PRODU_STOCK.cod_pro
                    AND IVTRACOM.fec_mov BETWEEN " + s_desde + "
                        AND " + s_hasta + " ) AS INGRESOSCOMPRA
             , (SELECT SUM(cantidad)
                FROM IVTRATRA
                WHERE IVTRATRA.destino = PRODU_STOCK.cod_sec
                    AND IVTRATRA.cod_pro = PRODU_STOCK.cod_pro
                    AND IVTRATRA.fec_mov BETWEEN " + s_desde + "
                        AND " + s_hasta + " ) AS INGRESOSTRANSF
             , (SELECT SUM(cantidad)
                FROM IVTRANOT
                WHERE IVTRANOT.cod_sec = PRODU_STOCK.cod_sec
                    AND IVTRANOT.cod_pro = PRODU_STOCK.cod_pro
                    AND IVTRANOT.fec_mov BETWEEN " + s_desde + "
                        AND " + s_hasta + " ) AS EGRESOSVENTA
             , (SELECT SUM(cantidad)
                FROM IVTRATRA
                WHERE IVTRATRA.origen = PRODU_STOCK.cod_sec
                    AND IVTRATRA.cod_pro = PRODU_STOCK.cod_pro
                    AND IVTRATRA.fec_mov BETWEEN " + s_desde + "
                        AND " + s_hasta + " ) AS EGRESOSTRANSF
             , PRODU_STOCK.stock AS INVFINAL
             , (SELECT PRODU_STOCK.stock
                FROM PRODU_STOCK
                WHERE PRODU_STOCK.COD_PRO = PRODU.COD_PRO
                    AND PRODU_STOCK.COD_SEC = '01') AS STOCKMATRIZ
        FROM   PRODU_STOCK
        WHERE  cod_sec IN (" + locales + ")) Q_PS
	 , PRODU
	 , SECCION
WHERE  Q_PS.cod_pro = PRODU.cod_pro
AND    Q_PS.cod_sec = SECCION.cod_sec
ORDER BY 1, 2, 3, 4;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar