2011-10-12 11 views
9

Ho una query ridicolmente massiccia generata da oggetti di business intelligence Web contro un database del server SQL per un sistema di budget. Uno sviluppatore di report ha creato questa query nella GUI e ha rilevato che non viene mai completata. L'ho lasciato funzionare la scorsa notte e funzionò per 7 ore prima che i nostri server si riavviassero per gli aggiornamenti di Windows.Come trovare la fonte di 'No Join Predicate'

Ho dato un'occhiata al piano di spiegazioni in sql e ho trovato alcuni avvertimenti su alcuni passaggi "Nested Loops (Inner Join) - due di questi avvisi in 3a all'ultima fase. L'avviso è "No Join Predicate".

L'altra nota che ho su questo è che la query contiene questo nella clausola dove:

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

Se mettete un solo codice di fondi in là, funziona benissimo - così in qualche modo aggiungere il secondo codice è rendere le cose su di noi cartesiane (forse, questo è ciò che accadrebbe senza un predicato di join).

Eventuali suggerimenti su come rintracciare questo down? 790 linee di SQL meraviglioso da attraversare, con nient'altro che join after join.

Potrebbe il piano di spiegazione indicare un'area specifica?

Grazie per l'assistenza.


Modifiche:

Impossibile inviare la query, cosa che la sicurezza ed è molto da grande da offuscare. E non vorrei che nessuno lo guardasse.

+1

1 - ** Messaggio query ** – JNK

+5

2 -. Assicurarsi di utilizzare l'esplicito 'sintassi JOIN' (' LEFT JOIN x su xy = zy'), non lo SYNAX implicita ('da x, z') – JNK

+1

Il piano di esecuzione ti dice le tabelle interessate, quindi come è difficile scoprirlo? È scritto con sintassi implicita 'JOIN'? –

risposta

4

Utilizzare il programma di formattazione SQL online per ottenere chiarezza sui join SQL; quindi dividere la query blocco per blocco per eseguire il debug del problema.

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

quindi è possibile utilizzare visualizzazione grafica del piano di server mssql; questo spiegherà tutto

P.S: se si dispone di una query con prestazioni scarse a causa di un loop nidificato che si unisce con nessun predicato di join, non è necessariamente il caso in cui manchi i criteri di join nella query. Controllare http://sqlserverselect.blogspot.com/2010/10/nested-loops-join-no-join-predicate.html

+1

Grazie per quel secondo link - questo potrebbe essere quello che sta succedendo. – Sam

Problemi correlati