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.(IMG:http://forum.php.pl/style_emoticons/default/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.(IMG:http://forum.php.pl/style_emoticons/default/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...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
ActivePlayer
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


  1. SEKLECT * FROM (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 WHERE A.cecha = 'g' AND ((A.wartosc = 'AR') OR (A.wartosc = 'GPS') OR (A.wartosc = 'ARUM')) ) TEMPA
  4. JOIN atrybuty A1 ON (A1.ktm = TEMPA.ktm AND A1.cecha = 'l' AND A1.wersjaref = TEMPA.wersjaref)
  5. JOIN atrybuty A2 ON (A2.ktm = TEMPA.ktm AND A2.cecha = 'r' AND A2.wartosc = '1' AND A2.wersjaref = TEMPA.wersjaref)
  6. JOIN atrybuty A3 ON ((A3.cecha = A1.cecha) AND (A3.wartosc = A1.wartosc) AND (A3.ktm containing('www_')))
  7. JOIN atrybuty A4 ON (A4.ktm = A3.ktm AND A4.cecha = 'gr')
  8. JOIN towary T ON (T.ktm = TEMPA.ktm AND T.witryna = '1' AND T.akt = '1')
  9. JOIN towary T1 ON (T1.ktm = A3.ktm AND T1.witryna = '1' AND T1.akt = '1')
  10. JOIN cennik C ON (C.ktm = TEMPA.ktm AND C.cennik = '62' AND C.wersja = '0')
  11. JOIN cennik C1 ON (C1.ktm = TEMPA.ktm AND C1.cennik = '63' AND C1.wersja = '0')
  12. JOIN towpliki TP ON (TP.ktm = A3.ktm AND TP.numer = '1')
  13. JOIN s_binary B ON (B.fileref = TP.ref)


czy masz pozakladane indexy, ile jest rekordow w kazdej z tabel?
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: 3.10.2025 - 04:10