WHERE strasznie wydłuża zapytanie

0

Cześć, mam dość dziwny problem. Napisałem sobie zapytanie. Zwykły select, 3 joinowane tabele(left join):


select [kolumny]
from tabela
left join tab1 on tab1.OID = tabela.OID
left join tab2 on tab2.ID = tab1.t2ID
left join tab3 on tab3.CID = tab1.ID and tab3.EID = tabela.ID

i teraz tak, zapytanie trwa 5 sekund. Zwraca około 90 tys. rekordów.
Ale, jeśli dołożę mu WHERE:


WHERE tabela.deleted = 0 --to trwa tyle samo
WHERE tabela.deleted = 0 and tabela.pole>1 -- tu już strasznie wydłuża.

Zmiana waruków miejscami nic nie daje. Więcej jest rekordów, co mają pole>1 niż deleted = 0.

Spotkaliście się kiedyś z analogiczną sytuacją, że WHERE powoduje dłuższe wykonanie zapytania?

0

Spróbuj wykonać tego selecta na tabeli tabela przed zjoinowaniem jej z pozostałymi.

1

n i może np. jakieś indeksy załóż. I oczywiście wpadłeś na coś takiego jak pooglądanie planu wykonania i wiesz dlaczego trwa dłużej...

0

Tak, patrzyłem na plany, kombinowałem z inline-tables, ale to nic nie daje. Doszedłem do momentu, gdzie wykonuje się mniej więcej tyle samo czasu, ale zwraca tylko kilka rekordów więcej(na rząd 90 tysięcy rekordów różnica wynosi 29). W związku z tym pytanie numer dwa. Mając dwa zapytania, które zwracają te same pola, mogę jakoś sprawdzić część rozdzielną tych zbiorów?

1

Niektóre bazy udostępniają zapytania operujące jedynie na indeksach (gdy są to "covering index").
Możliwe, że "pole" nie masz w indeksie i baza musi się odwołać do tabeli.

0

Ile rekordów ma cała tabela ?

1

prostytutka ja nie rozumiem cię juhas - jak tylko wyskakujesz z jakimś "problemem" to trzeba cię wręcz prosić o jakikolwiek kawałek kodu a nasze rady masz głęboko w dupie. Masz problem z czasem zapytania to pierwsze co robisz to DAJESZ DDL TABEL I EXECUTION PLAN jak sam sobie nie potrafisz z tym poradzić i TYLE a nie [CIACH!] jaki to wspaniały jesteś a jaka ta baza zła...

1
Juhas napisał(a):

Tak, patrzyłem na plany, kombinowałem z inline-tables, ale to nic nie daje. Doszedłem do momentu, gdzie wykonuje się mniej więcej tyle samo czasu, ale zwraca tylko kilka rekordów więcej(na rząd 90 tysięcy rekordów różnica wynosi 29). W związku z tym pytanie numer dwa. Mając dwa zapytania, które zwracają te same pola, mogę jakoś sprawdzić część rozdzielną tych zbiorów?

http://msdn.microsoft.com/en-us/library/ms188055

0

OK, już se poradziłem, indeksy były źle założone. Misiek, jak mam jakiś problem ZAWSZE daję kod. Tutaj nie spodziewałem się odpowiedzi w stylu nowego zapytania, bo patrząc na zadanie całościowo, jest zbyt skomplikowane, dlatego dałem zarys i otrzymałem konkretną odpowiedź, którą dał Krzysiek. Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0