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(uupah5 @ 6.07.2011, 16:09:10 ) *
pole status występuje kilkukrotnie z czego ostatni raz jest wzajemnie wykluczający się z przedostatnim

Nie wyklucza się - w obydwu przypadkach jest pole status + OR

Cytat(uupah5 @ 6.07.2011, 16:09:10 ) *
więc może jednak przekonstruować to zapytanie tak, aby pole status występowało samodzielnie i nadrzędnie, czyli coś w stylu:
status = a and (....)
or
status = b and (...)

Teraz zrobiłem tak:
  1. SELECT DISTINCT T.NumerRef, T.DataWyjazdu, T.ID_grupa_transportowa ,
  2. T.Pojazd, T.Datetime_do_kiedy_cena_tradycyjna, T.AnulowanyFE2,
  3. T.HD, T.IloscTowaruRzeczywista, T.Multistop, T.DataDostarczenia,
  4. PonaglenieDostarczenia, PonaglenieAwizacji,
  5. TIMESTAMPDIFF(MINUTE, NOW(), T.DateRealizacji) AS CzasDoKoncaRealizacji,
  6. T.PotwierdzeniePrzyjeciaZmian, T.IloscTowaru, T.Odleglosc, T.TerminWaznosci,
  7. T.GodzinaRealizacji, (DataDodaniaNaGielde + INTERVAL TerminWaznosci MINUTE) AS LicytacjaDo,
  8. T.Gielda, T.ID, T.DateRealizacji, T.STATUS, T.Numer, RodzajCiezarowki, ROUND(Cena,2) AS Cena,
  9. Waluta
  10. FROM
  11. m_transporty_miejsca AS TM LEFT JOIN
  12. m_transporty AS T ON (T.ID=TM.ID_transport)
  13. WHERE
  14. 1 AND
  15. (T.AnulowanyFE2='0' OR T.DateRealizacji>='2011-06-30') AND
  16. 1 AND
  17. T.Odleglosc>='9' AND
  18. T.Odleglosc<='102' AND
  19. T.ImportFE='1' AND
  20. ((T.Miejsce='akt' AND ((T.STATUS='przedstawiony' AND 1)
  21. OR (T.STATUS='gielda' AND T.Gielda='1' AND 1)
  22. OR T.ID_przewoznik='72'))
  23. OR (T.STATUS='zaksięgowane w SAP' AND T.DataDostarczenia IS NULL AND T.ID_przewoznik='72'))
  24. ORDER BY T.ID


i dalej nic.
Ze statusem to kłopot taki, że chcę wyswietlać rekordy w różnych statusach, ale przy każdym statusie muszą być spełnione dodakowe (za każdym statusem różne) warunki. Wystarczy, że zajdzie któryś z tych warunków:

1. T.Status='gielda' AND T.Gielda='1' AND 1 AND T.Miejsce='akt
2. T.Status='przedstawiony' AND 1 AND T.Miejsce='akt
3. T.ID_przewoznik='72 AND T.Miejsce='akt (bez różnicy na status)
4. T.Status='zaksięgowane w SAP' AND T.DataDostarczenia IS NULL AND T.ID_przewoznik='72'



Cytat(uupah5 @ 6.07.2011, 16:09:10 ) *
jeśli jest to wykonalne, to dać potem index na status. btw to musi być varchar?

Status ma index - tak jest varchar
Cytat(uupah5 @ 6.07.2011, 16:09:10 ) *
oraz rozumiem struktura jest świadomie zdenormalizowana?

Przypadek (IMG:style_emoticons/default/sad.gif)
Cytat(uupah5 @ 6.07.2011, 16:09:10 ) *
a na marginesie, 0.8s to jest faktycznie problem?

Bardzo długo (IMG:style_emoticons/default/sad.gif) 12razy dłużej niż bym chciał



Cytat(rollen @ 6.07.2011, 21:14:40 ) *
TomASS ma rację spróbuj jakoś przebudować tę część ze STATUS, bo jest całkowicie nieczytelana...

tylko jak ? Moja wyobraźnia chyba tego nie ogarnia już:/
Cytat(rollen @ 6.07.2011, 21:14:40 ) *
Wskazałeś też, że użyty został indeks ImportFE1: (ImportFE). Nie wiem jakie dane masz w columnie ImportFE, ale wydaje mi się, że to jakiś status z ograniczony do kilku wartości.

dwie możliwości - 0 oraz 1
Cytat(rollen @ 6.07.2011, 21:14:40 ) *
Taki indeks staje ję mało selektywny. Proponuję go rozszerzyć o T.Odległość.

pole odegłość to jedna z 20 możliwośći

dzięki chłopaki - pomóżcie jeszcze troszkę, może coś się uda.

Ten post edytował TomASS 7.07.2011, 00:00:15
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: 11.10.2025 - 16:48