Múltiples consultas a las mismas tablas en un mismo SP. Una de ellas tiene 11M de registros.
Publicado por Leandro (2 intervenciones) el 11/01/2019 02:00:05
Buen día a todos,
Espero me puedan ayudar, se los agradezco de antemano.
Tengo un stored procedure que inserta datos en una tabla X, estos datos son producto de la unión (UNION) de 14 consultas (SELECT ... FROM ... WHERE ...). El problema está en que cada una de estás consultas hace left joins a más de 10 tablas, las cuales son casi las mismas en las 14 consultas y de las cuales algunas de ellas cuentan con más de 11 y 7 millones de registros.
Lo que he pensado es hacer una consulta inicial con la máxima cantidad de coincidencias y tablas que tengan en común estas 14 consultas, y esta insertarla en una tabla temporal #TEMP para luego en las 14 consultas aplicarle las tablas y condiciones (WHERE ...) que les falten. De esta forma cargaría un universo inicial, para que luego las 14 consultas no choquen directamente a las tablas involucradas repetidas veces, que por cierto, algunas de ellas son tablas transaccionales. Este impacto causa bloqueos a la base de datos y es el problema que se me ha pedido resolver o al menos mejorar.
El problema que se me presenta es que realizar lo que he pensado me va a tomar mucho tiempo, por lo que el SP es muy extenso, y no estoy seguro si realmente mejore. Lo que les pregunto es si, en general, lo que estoy proponiendo podría dar buenos resultados. Pregunto esto porque cuando se hacen las 14 consultas actualmente, cada una de ellas cuenta con muchas restricciones en la clausula WHERE, por lo que cada una de ellas (14) es mucho más rápido en tiempo de ejecución que el universo que propongo haciéndole un SELECT * (cabe resaltar que la primera tabla en el FROM a la que se le hace los LEFT JOIN, es la que tiene los más de 11 millones de registros).
Mi pregunta es si están de acuerdo con mi propuesta, o si tienen algo más que añadir. En caso esten más interesados en el caso por favor coméntenmelo y les adjunto el archivo con el SP para que lo revisen.
PD: Ya analicé los índices y las estadísticas. Todos los joins tienen WITH (NOLOCK).
Saludos!
LCortez
Espero me puedan ayudar, se los agradezco de antemano.
Tengo un stored procedure que inserta datos en una tabla X, estos datos son producto de la unión (UNION) de 14 consultas (SELECT ... FROM ... WHERE ...). El problema está en que cada una de estás consultas hace left joins a más de 10 tablas, las cuales son casi las mismas en las 14 consultas y de las cuales algunas de ellas cuentan con más de 11 y 7 millones de registros.
Lo que he pensado es hacer una consulta inicial con la máxima cantidad de coincidencias y tablas que tengan en común estas 14 consultas, y esta insertarla en una tabla temporal #TEMP para luego en las 14 consultas aplicarle las tablas y condiciones (WHERE ...) que les falten. De esta forma cargaría un universo inicial, para que luego las 14 consultas no choquen directamente a las tablas involucradas repetidas veces, que por cierto, algunas de ellas son tablas transaccionales. Este impacto causa bloqueos a la base de datos y es el problema que se me ha pedido resolver o al menos mejorar.
El problema que se me presenta es que realizar lo que he pensado me va a tomar mucho tiempo, por lo que el SP es muy extenso, y no estoy seguro si realmente mejore. Lo que les pregunto es si, en general, lo que estoy proponiendo podría dar buenos resultados. Pregunto esto porque cuando se hacen las 14 consultas actualmente, cada una de ellas cuenta con muchas restricciones en la clausula WHERE, por lo que cada una de ellas (14) es mucho más rápido en tiempo de ejecución que el universo que propongo haciéndole un SELECT * (cabe resaltar que la primera tabla en el FROM a la que se le hace los LEFT JOIN, es la que tiene los más de 11 millones de registros).
Mi pregunta es si están de acuerdo con mi propuesta, o si tienen algo más que añadir. En caso esten más interesados en el caso por favor coméntenmelo y les adjunto el archivo con el SP para que lo revisen.
PD: Ya analicé los índices y las estadísticas. Todos los joins tienen WITH (NOLOCK).
Saludos!
LCortez
Valora esta pregunta
0