WHERE strasznie wydłuża zapytanie

WHERE strasznie wydłuża zapytanie
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

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

Kopiuj
 
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:

Kopiuj
 
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?

PO
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
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...

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
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?

__krzysiek85
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1019
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.

enix
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Ile rekordów ma cała tabela ?

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
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...

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
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

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
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!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.