2011-10-12 14 views
9

Mam absurdalnie masywne zapytanie generowane przez inteligencję obiektów biznesowych przeciwko bazie danych serwera SQL dla systemu budżetowego. Twórca raportu utworzył to zapytanie w interfejsie GUI i stwierdził, że nigdy się nie kończy. Pozwoliłem mu działać ostatniej nocy i działało przez 7 godzin, zanim nasze serwery zostały ponownie uruchomione w celu aktualizacji systemu Windows.Jak znaleźć źródło "No Join Predicate"

Spojrzałem na plan wyjaśniający w sql i znalazłem kilka ostrzeżeń na temat kilku kroków "Zagnieżdżone pętle (wewnętrzne połączenie)" - dwie z tych ostrzeżeń pobierają opłatę od trzeciego do ostatniego kroku. Ostrzeżenie to "Brak przydziału orzeczenia".

Druga uwaga mam na to, że kwerenda zawiera ten w klauzuli WHERE:

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

Jeśli umieścić tylko jeden kod Funduszu tam, to działa dobrze - tak jakoś dodając drugi kod jest robienie rzeczy kartezjańskich na nas (być może, to będzie działo się bez predykatu złączenia).

Wszelkie zalecenia dotyczące śledzenia tego problemu? 790 wierszy wspaniałego SQL do przebrnięcia, z niczym, ale dołącz po dołączeniu.

Czy plan wyjaśniający może wskazywać na konkretny obszar?

Dzięki za pomoc.


Edits:

Nie można zakładać zapytaniu, rzecz bezpieczeństwa i to dużo duże, by zaciemniać. I nie chciałbym nikogo na to patrzeć.

+1

1 - ** post zapytanie ** – JNK

+5

. 2 - Upewnij się, że korzystać z wyraźną 'JOIN' składni (' LEFT JOIN X na xy = zy'), a nie ukryte synax ('OD x, z') – JNK

+1

Plan wykonania informuje o tabelach, więc w jaki sposób trudno jest się o tym dowiedzieć? Czy jest napisany z niejawną składnią 'JOIN'? –

Odpowiedz

4

Użyj internetowego formatyzatora SQL, aby uzyskać przejrzystość połączeń SQL; następnie podziel blok kwerendy po bloku, aby debugować problem.

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

Następnie można użyć graficzny widok planu na serwerze mssql; to wszystko wyjaśni.

P.S: Jeśli masz słabo wykonaną kwerendę ze względu na zagnieżdżone pętle, dołącz bez predykatów łączenia, to nie jest tak, że brakuje ci kryteriów łączenia w zapytaniu. Sprawdź http://sqlserverselect.blogspot.com/2010/10/nested-loops-join-no-join-predicate.html

+1

Dzięki za ten drugi link - to może być, co się dzieje. – Sam