1

Temat: Jak to zoptymalizować???

Witam
Mam takie zapytanie i do czasu jak była mała liczba danych było ok jednak teraz wykonuje się bardzo długo i chciałbym to jakiś zoptymalizować. Dla uproszczenia posłużę się symbolicznymi nazwami:

SELECT
      tabela1.kolumna1,
      tabela2.kolumna1, 
      tabela2.kolumna2,
      tabela2.kolumna3,
      tabela3.kolumna1
FROM 
      schemat1.tabela1,
      schemat2.tabela2,
      schemat3.tabela3
WHERE 
    date(tabela1.kolumna1) >= '2010-06-04' AND
    date(tabela1.kolumna1) <= '2010-06-09' AND
        tabela3.kolumna2 = tabela2.kolumna2 AND
        tabela1.kolumna2 = tabela2.kolumna4 AND
        tabela1.kolumna2 IN (SELECT tabela4.kolumna1
                        FROM schemat2.tabela4
                        WHERE kolumna1 = 1) OR
        tabela1.kolumna2 IN (SELECT DISTINCT tabela5.komumna1
                                              FROM  schemat2.tabela5,
                                                         schemat2.tabela6
                                              WHERE
                                                         tabela4.kolumna3 IN (SELECT tabela3.kolumna2 
                                                                                            FROM schemat2.tabela3) AND
                                                                                            kolumna2 = 1);

Wygląda to na zagmatwane ale nie mam pomysłu jak to uprościć.
Po za tym przydałoby się chyba po indeksować niektóre tabele tylko czy to coś przyspieszy?
A może jakieś ustawienia w pliku konfiguracyjnym coś przyspieszą?

2

Odp: Jak to zoptymalizować???

tabela1.kolumna2=1

3

Odp: Jak to zoptymalizować???

Dzięki za podpowiedź to niestety jest tylko mały fragment całości. Z tego co zauważyłem to problem pojawia się gdy podzapytania typu

tabela1.kolumna2 IN (SELECT tabela4.kolumna1
                        FROM schemat2.tabela4
                        WHERE kolumna1 = 1)

 
zwracają dużą ilość danych (ale to chyba oczywiste). Już teraz nie pamiętam dokładniej przyczyny ale właśnie porównania typu

tabela1.kolumna2=1

nie dawały oczekiwanych rezultatów dlatego stosuję takie jak wyżej.
Doraźnie zmieniłem na przeciwną logikę czyli  coś takiego 

tabelaX.kolumnaY NOT IN (SELECT tabelaZ.kolumna itd.)

gdzie wyników z tego select'a jest mniej.

4

Odp: Jak to zoptymalizować???

tabela1.kolumna2=1

5

Odp: Jak to zoptymalizować???

z tego co sobie przypominam to chyba chodziło o to że nie mogłem uzyskać warunku złączenia typy zawiera się w jednej tabeli ale nie ma w innej czyli

tabela1.kolumna2 NOT IN (SELECT tabela4.kolumna1
                           FROM schemat2.tabela4
                           WHERE kolumna1 = 1)

dla takiego zapisu

tabela1.kolumna2=1

musiałoby być

tabela1.kolumna2<>1

a to chyba nie przejdzie...

Ostatnio edytowany przez WitekS (2010-06-22 10:21:30)

6

Odp: Jak to zoptymalizować???

No ale w tym co podałeś nie ma NOT IN tylko IN, więc wciąż nie wiem w czym problem.
Może podaj to zapytanie tak jak ono wygląda w oryginale.