SQL - como agilizar consulta SQL

 
Vista:

como agilizar consulta SQL

Publicado por Alicia (1 intervención) el 06/08/2018 04:44:27
buenas noches, tengo la siguiente consulta pero se tarda hasta mas de 24 horas en ejecutar
Las bases de datos no las administro yo, pero quisiera saber como puedo mejorar mi SCRIPT, para que se ejecute más rapido

Gracias

SELECT T1.C_FIS_ICDOEMN1, T1.C_FIS_IFEDALE1, F_FIS_FEFEEMA1, T1.F_FIS_FIFEENA1,
(SELECT T5.F_FIS_FCCEAFC1 FROM SAT.DD_FIS_CCCAOAT1 AS T5 WHERE T1.C_FIS_IFEDALE1=T5.C_FIS_IFEDALE1) FECHACANCELACION , F_FIS_FFFOEOI1,
T1.D_FIS_RFCEEEO1,(SELECT D_FIS_NEOMMIB1 FROM SAT.DD_FIS_EMISOR01 AS T2 WHERE T1.C_FIS_ICDOEMN1=T2.C_FIS_ICDOEMN1) NOMEMISOR,
D_FIS_RFCREEO1, (SELECT D_FIS_NROEMCB1 FROM SAT.DD_FIS_RECEPTO1 AS T3 WHERE T1.C_FIS_ICDOEMN1=T3.C_FIS_ICDOEMN1) NOMRECEPTOR,
I_FIS_CANTIDA1, D_FIS_UNIDAD01, D_FIS_NIUDMEE1, D_FIS_DESCRIP1, I_FIS_IMPORTE1

FROM SAT.DD_FIS_CFEOALM1 AS T1 INNER JOIN SAT.DD_FIS_CONCEPT1 AS T4
ON T1.C_FIS_ICDOEMN1=T4.C_FIS_ICDOEMN1

WHERE T1.D_FIS_RFCEEEO1 in ('NOMBRE1','NOMBRE2')
AND YEAR(T1.F_FIS_FEFEEMA1)=2017

ORDER BY T1.F_FIS_FEFEEMA1, T1.C_FIS_ICDOEMN1
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

como agilizar consulta SQL

Publicado por Leonardo Josué (1173 intervenciones) el 06/08/2018 15:50:02
Hola Alicia:

El desempeño de una consulta en cualquier manejador de Base de Datos depende no sólo de la consulta en si, sino de muchos factores que la pueden afectar, sin embargo, en tu post das muy poca (o nada) de información al respecto:

Primero, no nos dices con qué Base de Datos estás trabajando, por lo tanto es un tanto complicado darte una respuesta puntual en cuanto a cómo puedes cambiar la consulta, pues la sintaxis entre cada DBMS puede variar bastante. Además tendríamos que revisar también la configuración del propio servidor, para ver si hay algo que pueda afectar la velocidad de ejecución.

Segundo, no nos dices cuál es la estructura de cada una de tus tablas, ni pones datos de ejemplo por lo tanto, no sabemos qué índices tiene cada una de ellas ni de qué tipos son tus campos. El desempeño en las consulta suele estar directamente relacionado con los índices y los tipos de dato, por ejemplo en la búsquedas tipo IN sobre cadenas.

Tercero, no nos das información acerca del volumen de información que hay en tus tablas. Este también puede ser un factor que influye en el desempeño de las consultas. Si hablamos de millones de registros debes de usar estrategias distintas a si hablamos de unos cuantos cientos o miles.

Cuarto, no nos dices cómo están relacionadas las tablas (1 a 1, 1 a muchos, muchos a muchos) por lo tanto tampoco podemos decirte alguna otra alternativa a las subconsultas que estas haciendo, ya que el uso excesivo de sobconsultas es un factor que debes de evitar en lo posible.

Entonces, sin toda esta información, cualquier respuesta que te podamos dar sería tratar de jugar al adivino y no podríamos asegurar que funcione. Pero bueno, tratemos de jugar al Nostradamus y veamos si esto te puede servir.

Como dije en el punto cuatro, no es recomendable hacer tantas sobconsultas en el SELECT, es mejor hacer tantos JOIN's como necesites. Suponiendo que todas tus tablas se relaciones 1 a 1 entonces podrías hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT
  T1.C_FIS_ICDOEMN1,
  T1.C_FIS_IFEDALE1,
  F_FIS_FEFEEMA1,
  T1.F_FIS_FIFEENA1,
  T5.F_FIS_FCCEAFC1 FECHACANCELACION,
  F_FIS_FFFOEOI1,
  T1.D_FIS_RFCEEEO1,
  T2.D_FIS_NEOMMIB1 NOMEMISOR,
  D_FIS_RFCREEO1,
  T3.D_FIS_NROEMCB1 NOMRECEPTOR,
  I_FIS_CANTIDA1,
  D_FIS_UNIDAD01,
  D_FIS_NIUDMEE1,
  D_FIS_DESCRIP1,
  I_FIS_IMPORTE1
FROM SAT.DD_FIS_CFEOALM1 AS T1
INNER JOIN SAT.DD_FIS_EMISOR01      AS T2 ON T1.C_FIS_ICDOEMN1 = T2.C_FIS_ICDOEMN1
INNER JOIN SAT.DD_FIS_RECEPTO1      AS T3 ON T1.C_FIS_ICDOEMN1 = T3.C_FIS_ICDOEMN1
INNER JOIN SAT.DD_FIS_CONCEPT1      AS T4 ON T1.C_FIS_ICDOEMN1 = T4.C_FIS_ICDOEMN1
INNER JOIN FROM SAT.DD_FIS_CCCAOAT1 AS T5 ON T1.C_FIS_IFEDALE1 = T5.C_FIS_IFEDALE1
WHERE T1.D_FIS_RFCEEEO1 in ('NOMBRE1','NOMBRE2')
AND YEAR(T1.F_FIS_FEFEEMA1) = 2017


No estoy seguro de que esto pueda funcionar o que te dé el mismo resultado que esperas... como dije, estoy simplemente de tratar de adivinar sin más información. Además, aquí hay algunas mejores prácticas que te pueden ayudar.

1. Hay algunos campos en donde no loes antepones el nombre de la tabla a la que pertenecen:

1
2
3
4
F_FIS_FEFEEMA1,
F_FIS_FFFOEOI1,
D_FIS_RFCREEO1,
...

Es recomendable que TODOS LOS CAMPOS TENGAN EL PREFIJO DE LA TABLA A LA QUE PERTENECEN, ya que de lo contrario el DBMS tiene que hacer una comprobación lógica sobre de todas las tablas para saber qué campo debe pintar y además suelen pasar errores de columna ambigua.

2. La cláusula IN es una de las que peor desempeño tienen en base de datos, sobre todo cuando comparas contra cadenas. Puedes probar cambiarla por comparaciones tipo AND-OR:

1
2
3
4
5
...
WHERE
( T1.D_FIS_RFCEEEO1 = 'NOMBRE1' OR
  T1.D_FIS_RFCEEEO1 = 'NOMBRE2')
...

3. Por definición, la ordenación es un proceso muy lento, sobre todo si no tienes un uso adecuado de índices. Prueba ejecutar la consulta SIN ORDER BY y compara los tiempos de respuesta. Como te dije en los puntos segundo y tercero, sin saber qué indices tienes y qué cantidad de registros tienen tus tablas, es imposible saber si hay algo que se pueda mejorar.

Finalmente, la mayoría de los DBMS's actuales tienen herramientas para analizar tus consultas, como el plan de ejecución de SQL Server o el EXPLAIN de MySQL... investiga si tu Motor de Base de Datos tiene alguna de estas utilerías para optimizar tus consultas.

Has la prueba y nos comentas, y si continuas con problemas, entonces atiende a lo que te comento y danos más información de tu modelo.

Saludos
Leo.
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