2011-10-12 7 views
9

Tengo una consulta ridículamente masiva generada por objetos de negocio de inteligencia web contra una base de datos de SQL Server para un sistema de presupuesto. Un desarrollador de informes ha creado esta consulta en la GUI y ha encontrado que nunca termina. Lo dejé correr anoche y funcionó durante 7 horas antes de que nuestros servidores reiniciaran las actualizaciones de Windows.Cómo encontrar la fuente de 'No Unir Predicado'

Eché un vistazo al plan de explicación en sql y encontré algunas advertencias en unos pocos pasos de 'Anidados en bucles (combinación interna): dos de estas tarifas de advertencias en el 3er hasta el último paso. La advertencia es 'No unirse predicado'.

La otra nota que tengo en esto es que la consulta contiene esta en la cláusula where:

BF_FUND.CD IN ('0105','0101') 

Si sólo se pone un código de fondo de ahí, funciona muy bien - por lo que de alguna manera agregando el segundo código es haciendo que las cosas se vuelvan cartesianas para nosotros (tal vez, esto es lo que sucedería sin un predicado de unión).

¿Alguna recomendación sobre cómo rastrear esto? 790 líneas de maravilloso SQL para navegar, con nada más que unirse después de unirse.

¿Podría el plan de explicación apuntar a un área específica?

Gracias por su ayuda.


ediciones:

No puede enviar la consulta, que la seguridad y es mucho más grande a ofuscar. Y no quisiera hacer que nadie lo mire.

+1

1 - ** ** Deja la consulta – JNK

+5

2 -. Asegúrese de que utiliza la sintaxis 'JOIN' explícita (' combinación izquierda en x = xy zy'), no el SYNAX implícita ('desde x, z') – JNK

+1

El plan de ejecución le dice las tablas en cuestión, entonces, ¿cómo es difícil de averiguar? ¿Está escrito con la sintaxis implícita 'JOIN'? –

Respuesta

4

Utilice el formateador SQL en línea para obtener claridad sobre sus uniones de SQL; luego divida su consulta bloque por bloque para depurar el problema.

http://www.dpriver.com/pp/sqlformat.htm

A continuación, puede utilizar la vista gráfica del plan en el servidor mssql; eso explicará todo.

P.S: si tiene una consulta de bajo rendimiento debido a un bucle anidado unirse sin ningún predicado (s) de unión, no es necesario que falte el criterio de unión en su consulta. Comprobar http://sqlserverselect.blogspot.com/2010/10/nested-loops-join-no-join-predicate.html

+1

Gracias por ese segundo enlace - esto podría ser lo que está pasando. – Sam

Cuestiones relacionadas