Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Firebird] Problem z długimi zapytaniami do bazy i długimi oczekiwaniami na odpowiedź z bazy
Sokrates
post
Post #1





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

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


Witam,

Staram sie jakoś zoptymalizować zapytanie bo obecnie trwa bardzo długo. Nie wiem czy to wina bazy
(a słyszałem bardzo wiele złego o tej bazie jeśli idzie o używaną pamięci),
czy może moje zapytanie SQL jest nie optymalne.

O to moje zapytanie SQL w jednym wywołaniu:
  1. SELECT A.ktm, A1.wartosc AS liniawww, A4.wartosc AS kategoria, T.nazwa, T1.opispod, T1.opisroz,
  2. C.cenanet AS cenadetal, C1.cenanet AS cenahurt, TP.ref, B.ext
  3. FROM atrybuty A JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'l' AND A1.wersjaref = A.wersjaref)
  4. JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'r' AND A2.wartosc = '1' AND A2.wersjaref = A.wersjaref)
  5. JOIN atrybuty A3 ON ((A3.cecha = A1.cecha) AND (A3.wartosc = A1.wartosc) AND (A3.ktm containing('www_')))
  6. JOIN atrybuty A4 ON (A4.ktm = A3.ktm AND A4.cecha = 'gr')
  7. JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1' AND T.akt = '1')
  8. JOIN towary T1 ON (T1.ktm = A3.ktm AND T1.witryna = '1' AND T1.akt = '1')
  9. JOIN cennik C ON (C.ktm = A.ktm AND C.cennik = '62' AND C.wersja = '0')
  10. JOIN cennik C1 ON (C1.ktm = A.ktm AND C1.cennik = '63' AND C1.wersja = '0')
  11. JOIN towpliki TP ON (TP.ktm = A3.ktm AND TP.numer = '1')
  12. JOIN s_binary B ON (B.fileref = TP.ref)
  13. WHERE A.cecha = 'g' AND ((A.wartosc = 'AR') OR (A.wartosc = 'GPS') OR (A.wartosc = 'ARUM'))


Czas oczekiwania na wynik tego zapytania trwa od 5 do 12 min.exclamation.gif!!

oraz zapytanie SQL w 17 zapytaniach: (Najpierw jedno zapytanie:)
  1. SELECT A.ktm, A.wartosc, A1.wartosc AS grupa, A2.wartosc AS nazwa,
  2. T.opispod, T.opisroz, TP.ref, B.ext
  3. FROM atrybuty A JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'gr')
  4. JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'l')
  5. JOIN atrybuty A3 ON (A3.ktm = A.ktm AND A3.cecha = 'podstawowy' AND A3.wartosc = '1')
  6. JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1')
  7. JOIN towpliki TP ON (TP.ktm = A.ktm AND TP.numer = '1')
  8. JOIN s_binary B ON (B.fileref = TP.ref)
  9. WHERE A.cecha = 'g' AND (A.wartosc = 'AR' OR A.wartosc = 'GPS' OR A.wartosc = 'ARUM')


a następnie wyniki poprzedniego zapytania puszczam w pętli foreach
i dla każdego wiersza wywołuje kolejne zapytanie SQL (jest takich wywołań 16):
  1. SELECT A.ktm, C.cenanet AS cenadetal, C1.cenanet AS cenahurt, T.nazwa
  2. FROM atrybuty A
  3. JOIN atrybuty A1 ON (A1.ktm = A.ktm AND A1.cecha = 'g' AND A1.wartosc = '".$a_grprod['wartosc']."')
  4. JOIN atrybuty A2 ON (A2.ktm = A.ktm AND A2.cecha = 'r' AND A2.wartosc = '1')
  5. JOIN towary T ON (T.ktm = A.ktm AND T.witryna = '1')
  6. JOIN cennik C ON (C.ktm = A.ktm AND C.cennik = '62' AND C.wersja = '0')
  7. JOIN cennik C1 ON (C1.ktm = A.ktm AND C1.cennik = '63' AND C1.wersja = '0')
  8. WHERE A.wartosc = '".$a_grprod['nazwa']."' AND A.cecha = 'l'


Czas oczekiwania na wynik tych dwóch powyższych zapytań (z czego drugie zapytanie jest wywołane w pętli 16 razy) trwa od 1 do 2 min.exclamation.gif

Wyniki tych zapytań są identyczne.

I teraz pytanie, dlaczego tak sie dzieje...

Może zapytania SQL są jakoś przeze mnie mało efektywnie stworzone..


Wielkie dzięki za jakąkolwiek pomoc, sugestie albo uwagii...
Pozdrawiam...


--------------------
Pozdrawiam,
Sokrates
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 21.08.2025 - 03:54