Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania, Mam sporo informacji ale nie potrafię sobie z tym poradzić
TomASS
post
Post #1





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Cześć, mam takie oto zapytanie:

  1. SELECT
  2. DISTINCT T.NumerRef
  3. FROM
  4. m_transporty_miejsca AS TM LEFT JOIN
  5. m_transporty AS T ON (T.ID=TM.ID_transport)
  6. WHERE
  7. 1 AND
  8. (AnulowanyFE2='0' OR DateRealizacji>='2011-06-29') AND
  9. 1 AND
  10. T.Odleglosc>='0' AND
  11. T.Odleglosc<='99' AND
  12. T.ImportFE='1' AND
  13. ( T.ID_przewoznik='72' OR (STATUS='przedstawiony' AND 1) OR (Gielda='1' AND STATUS='gielda' AND 1) ) AND
  14. ( Miejsce='akt' OR (STATUS='zaksięgowane w SAP' AND DataDostarczenia IS NULL) )
  15. ORDER BY T.ID


Tabela m_transporty_miejsca 200 000 rekordów
Tabela m_transporty 100 000 rekordów
raczej małe ilości.

Zapytanie wykonuje się około 0,8s (średnia z 20pomiarów).
Jeśli usunę ostatni warunek w klauzuli WHERE:
  1. ( Miejsce='akt' OR (STATUS='zaksięgowane w SAP' AND DataDostarczenia IS NULL) )

a szczególnie
  1. OR (STATUS='zaksięgowane w SAP' AND DataDostarczenia IS NULL)

wówczas czas zapytania spada do 0,03 (średnia z 20pomiarów)

Indexy jakie min. mam pozakładane na tabelę m_transporty to:
ImportFE1: (ImportFE)
ImportFE2: (ImportFE+Miejsce)
ImportFE3: (ImportFE+Status+DataDostarczenia)

EXPLAIN tego zapytania wskazuje, że użyty jest indeks "ImportFE1"

Proszę o pomoc w optymalizacji.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
TomASS
post
Post #2





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Cytat
Abstrahując od powyższych wypowiedzi - zwróciłeś uwagę na fakt że warunek który drastycznie zmienia czas wykonania różni się czymś od pozostałych? Bo jak dla mnie wyróżnia go jedno - klauzula IS(NOT) NULL. Wcześniej wykonujesz LEFT JOIN - złączenie zewnętrzne. Te złączenia nie dają się tak łatwo optymalizować jak złączenia wewnętrzne (INNER JOIN) zwłaszcza że tutaj dokonujesz porównania na wartości NULL (która jest tworzona przez LEFT JOIN). Podejrzewam że z tym warunkiem baza musi przemielić znacznie więcej rekordów niż bez niego - i to pewnie wpływa na czas wykonania. Poeksperymentuj jak to wygląda bez porównań do NULLa (lub spróbuj je jakoś wyeliminować).

Dzięki, całkowite usunięcie warunki z IS NULL nic nie dało w przyspieszeniu zapytania (IMG:style_emoticons/default/sad.gif)


Cytat
rochę dziwne używać ENUM dla wartosci numerycznych

Czy dla pól, które mogą przyjąć tylko wartości 0/1/2/3 - lepiej jest użyć (small)int czy Enum (0/1/2/3)?
Czy konwersja ENUM->SMALLINT nie sprawi mi kłopotu (utrata danych/kłopoty w zapytaniach?)

dzięki.

Ten post edytował TomASS 10.07.2011, 13:35:53
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 16:01