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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-07-19 07:54:31

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Optymalizacja zapytania SQL...

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:


Kod:

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

 

#2  2012-07-19 10:15:33

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: Optymalizacja zapytania SQL...

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

 

#3  2012-07-19 14:42:28

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: Optymalizacja zapytania SQL...

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

 

#4  2012-07-19 14:48:28

  jezoo - Dzięcioł

jezoo
Dzięcioł
Skąd: Z lasu
Zarejestrowany: 2005-09-02

Re: Optymalizacja zapytania SQL...

@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)


LRU #480459

Offline

 

#5  2012-07-19 18:16:53

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: Optymalizacja zapytania SQL...

@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

 

#6  2012-07-25 13:19:19

  jezoo - Dzięcioł

jezoo
Dzięcioł
Skąd: Z lasu
Zarejestrowany: 2005-09-02

Re: Optymalizacja zapytania SQL...

offfff____top :)
@Huk, takie kilku godzinne cuda to raczej by na produkcje nie weszły :)


LRU #480459

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)