Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam.
Mam w pracy pewną rozkminkę którą nie wiem jak ugryźć...
Mam ja sobie tabelkę do pewnych rzeczy w której mam 4 pola logiczne. Po tych polach muszę sobie zawężać wynik zapytania SQL do drugiej tabeli, na zasadzie:
Jeżeli pole 1 jest true to wyświetl wyniki o statusie X, jak pole 2 jest tru to Y, ale jak pola X i Y są true to wyświetl wyniki zarówno dla X jak i Y.
O ile zapytania sobie napisałem i nawet działa na zasadzie:
SELECT ... JOIN MAG_KARTOTEKA_TOWARU AS MKT ON (MKT.KT_KATEGORIA= CASE WHEN SFZ.FZ_MOZE_WYCENIAC_POJAZDY=1 THEN ('4039ad9c-20dd-4b15-80bb-bb92fccb5c73') ELSE '00000000-0000-0000-0000-000000000000' END) JOIN MAG_KARTOTEKA_TOWARU AS MKT2 ON (MKT2.KT_KATEGORIA= CASE WHEN SFZ.FZ_MOZE_WYCENIAC_MI_U=1 THEN ('6ba1d501-cf44-42d2-bead-0b91f115755c') ELSE '00000000-0000-0000-0000-000000000000' END) JOIN MAG_KARTOTEKA_TOWARU AS MKT3 ON (MKT3.KT_KATEGORIA= CASE WHEN SFZ.FZ_MOZE_WYCENIAC_KOMPUTERY=1 THEN ('195e280a-e257-4489-984f-e0e341c24a7d') ELSE '00000000-0000-0000-0000-000000000000' END) WHERE ...
Tyle że jak widać nie dość że to paskudnie wygląda to działa strasznie wolno - naprawdę STRASZNIE, w tabelce mam 5 wierszy a M$ SQL server muli powyższe przez 3-4 sekundy, nawet nie chcę myśleć co będzie jak tabela zapełni się prawdziwymi danymi :/
Pytanie do was, czy ktoś wie jak można zoptymalizować powyższe zapytanie? Od razu dodam że pozbyć się pól bitowych będzie ciężko ze względu na ograniczenia softu na którym tworzę.
Z góry dzięki za info.
Pozdro.
Offline
Ten kawałek to problem, bo brzydko wygląda? ;] Jak chcesz optymalizacji zapytania to imho powinieneś wkleić całość. Poza tym trochę dziwnie wygląda sprawdzanie uprawnień w bazie danych. Jeszcze jakieś boolenay czy może to czy może tamto, skoro czy może sprowadza się do dostępu do kategorii o określonym uuid to czemu nie przypisać listy kategorii od razu użytkownikowi? Zostało by JOIN MAG_KARTOTEKA_TOWARU AS MKT ON MKT.KT_KATEGORIA IN (...) . Jedno złączenie zamiast trzech do tej samej tabeli. Nie lepsze by były zwykłe id kategorii zamiast tych długich uuid-ów?
Offline
Kurcze wczoraj próbowałem zrobić jak podałeś i ni chu chu nie chciało działać a dzisiaj zmieniłem tego babocha na coś takiego:
JOIN MAG_KARTOTEKA_TOWARU AS MKT ON (MKT.KT_KATEGORIA IN
(
CASE WHEN SFZ.FZ_MOZE_WYCENIAC_POJAZDY=1 THEN ('4039ad9c-20dd-4b15-80bb-bb92fccb5c73') ELSE '00000000-0000-0000-0000-000000000000' END+','+
CASE WHEN SFZ.FZ_MOZE_WYCENIAC_MI_U=1 THEN ('6ba1d501-cf44-42d2-bead-0b91f115755c') ELSE '00000000-0000-0000-0000-000000000000' END+','+
CASE WHEN SFZ.FZ_MOZE_WYCENIAC_KOMPUTERY=1 THEN ('195e280a-e257-4489-984f-e0e341c24a7d') ELSE '00000000-0000-0000-0000-000000000000' END+','+
CASE WHEN SFZ.FZ_MOZE_WYCENIAC_CAREFLEET=1 THEN ('4238e280-20b7-4d6e-be9b-95dc0cf8b1cc') ELSE '00000000-0000-0000-0000-000000000000' END)
)
i już działa OK ;] (pewnie gdzieś nawiasu nie domknąłem wczoraj...). Tak wiem, że nadal ładne to to może nie jest, ale zamiast 3-4 sekund wykonuje się od razu :)
Dzięki za info. Temat do zamknięcia.
Pozdro.
Offline
@Huk, jak u Ciebie 3-4sek jest dlugo to co powiesz jak zapytanie (jedno) wykonywalo sie ok. 18sek :P
W projekcie przy ktorym teraz robie to mialem 4 takie smakolyki :) po napisaniu na nowo robia sie w 2.5 sek :D
--- EDIT
Dodam, ze to nie ja pisalem tamte poprzednie :)
Ostatnio edytowany przez jezoo (2012-07-19 14:49:05)
Offline
@jezoo:
Nie no mogą być i takie co się kilka godzin wykonują mnie to nie robi różnicy... no ale nie przy trzech wierszach w tabeli ;]
EDIT:
Dodam że u mnie rekordem było podzapytanie na LINQ'u napisane w .NET. Przez pewien baboch proste podzapytanie (ze 3 joiny) wykonywało się z 10 sekund, po optymalizacji jakieś 0.01 ;] tak więc już troszkę się przekonałem że różne ciekawe błędy można zrobić.
Pozdro.
Ostatnio edytowany przez Huk (2012-07-19 18:21:35)
Offline
offfff____top :)
@Huk, takie kilku godzinne cuda to raczej by na produkcje nie weszły :)
Offline