Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymailizacja!=while
Forum PHP.pl > Forum > Przedszkole
styx
Witam

Mam problem z zaglebionym while. Tzn. jeżeli w wyciąganiu rekordów z bazy używam while w while to wykonanie całego skryptu zajmuje dużo czasu. Siega nawet rzędu kilkunastu sekund. Chciałbym się dowiedzieć czy jest to wina php-a którego posiadam ver.4.3.10-16, czy moWże w czymś innym. Dodam że nie mogę użyć jedengo zapytania do bazy. A i tak pojedyńczy while działa jak dla mnie za wolno. Wiem że znowu pytam sie pewnie o jakieś totalne podstawy, no ale trudno. Jak coś to pokaże fragentu kodu ale myślę że nie są one tutaj potrzebne. Dla uzupełnienia dodam, że chodzi mi o mssql-a i while typu while ($cos = mssql_fetch_array($query))
ActivePlayer
problem jest raczej w wydajnosci bazy danych. pokaż zapytanie, aby rozwiać wątpliwości smile.gif
kszychu
To również zależy od ilości danych. Rozumiem, że na podstawie wyników jednego zapytania generujesz inne zapytania, stąd te dwie pętle while.
W bardzo wielu przypadkach da się załatwić to jednym zapytaniem.
styx
powiem tak nie moge w inny sposob wyciagnąć z bazy informacji, i myślałem że to wina while-a, ale pokaże ten kawałek skryptu


  1. <?php
  2.  
  3. for ($licznik81=1;$licznik81<=$_SESSION['iloscmaszyn'];$licznik81++)
  4. {
  5.           $MM=$_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']]['id'];
  6.           $query = "SELECT DISTINCT ZLECENIE_PRODUKCYJNE.ID_PRODUKT
  7.                     FROM
  8.                     ZLECENIE_PRODUKCYJNE,PLAN_DZIENNY_ZAWARTOSC,PLAN_DZIENNY_ZAW
    ARTOSC_ZMIANA
  9.                     WHERE
  10.                     (ZLECENIE_PRODUKCYJNE.ID_ZLECENIE_PRODUKCYJNE = PLAN_DZIENNY_ZAWARTOSC_ZMIAN
    A.ID_ZLECENIE_PRODUKCYJNE) AND
  11.                     (PLAN_DZIENNY_ZAWARTOSC_ZMIANA.ID_PLAN_DZIENNY_ZAWARTOSC = PLAN_DZIENNY_ZAWA
    RTOSC.ID_PLAN_DZIENNY_ZAWARTOS
  12.                     (PLAN_DZIENNY_ZAWARTOSC.ID_MASZYNA=$MM) AND
  13.                     (PLAN_DZIENNY_ZAWARTOSC.ID_PLAN_DZIENNY = $_SESSION[kodplanu])";
  14.           $result = mssql_query($query);
  15.           if ($result!=1)
  16.           while($wier1=mssql_fetch_array($result))
  17.           {
  18.             $_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']]['iloscw']++;
  19.             $yt = $_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']]['iloscw'];
  20.             $_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']][$yt] = $wier1['ID_PRODUKT'];
  21.              // print  'maszyn:'.$_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']]['iloscw'].'<br>';
  22.                $query = "SELECT DISTINCT PLAN_DZIENNY_ZAWARTOSC_ZMIANA.ID_PLAN_DZIENNY_ZAWARTOSC_ZMI
    ANA,PLAN_DZIENNY_ZAWARTOSC
  23.                     FROM
  24.                     ZLECENIE_PRODUKCYJNE,PLAN_DZIENNY_ZAWARTOSC,PLAN_DZIENNY_ZAW
    ARTOSC_ZMIANA
  25.                     WHERE
  26.                     (ZLECENIE_PRODUKCYJNE.ID_ZLECENIE_PRODUKCYJNE = PLAN_DZIENNY_ZAWARTOSC_ZMIAN
    A.ID_ZLECENIE_PRODUKCYJNE) AND
  27.                     (PLAN_DZIENNY_ZAWARTOSC_ZMIANA.ID_PLAN_DZIENNY_ZAWARTOSC = PLAN_DZIENNY_ZAWA
    RTOSC.ID_PLAN_DZIENNY_ZAWARTOS
  28.                     (PLAN_DZIENNY_ZAWARTOSC.ID_MASZYNA=$MM) AND
  29.                     (PLAN_DZIENNY_ZAWARTOSC.ID_PLAN_DZIENNY = $_SESSION[kodplanu]) AND
  30.                     (ZLECENIE_PRODUKCYJNE.ID_PRODUKT = $wier1[ID_PRODUKT]) ";
  31.                 $result4 = mssql_query($query);
  32.                 while ($wierszu = mssql_fetch_array($result4))
  33.                 {
  34.                
  35.                   $l++;
  36.                   if ($wierszu['ile']!='') $_SESSION['maszyna'][$licznik81][$_SESSION['wydzial']]['biezacy']=1;
  37.  
  38.                  if ($l==1) $_SESSION['z1'][$licznik81][$_SESSION['wydzial']][$yt]=$wierszu['ile'];
  39.                  if ($l==2) $_SESSION['z2'][$licznik81][$_SESSION['wydzial']][$yt]=$wierszu['ile'];
  40.                  if ($l==3) $_SESSION['z3'][$licznik81][$_SESSION['wydzial']][$yt]=$wierszu['ile'];
  41.                  //print 'z1-'.$licznik81.'-'.$_SESSION['wydzial'].'-'.$yt;
  42.                 }
  43.                   $l=0;
  44.           }
  45. }
  46.  
  47.  
  48. ?>


a i danych w bazie jest mało może z 5tys
ActivePlayer
count($_SESSION['iloscmaszyn'])*ilosc_z_pierwszego_zapytania*ilosc_z_drugiego_zapytania = ilosc zapytan.
zakladam ze 1 zapytanie zwroci 100 rekordów, drugie 1 a w sesji jest liczba 5 to masz skromnie 500 zapytań. nie przyglądałem sie za bardzo w skrypt, ale zapewne mozna to zrobic jednym.
styx
Owszem masz rację, ale jeżeli zrobię jedno zapytanie, to jeżeli nie będzie istniało zlecenie produkcyjne (wynik z drugiego zapytania) to całe zapytanie też nic nie da, a muszę mieć wszystkie produkty + zleceenia produkcyjne jeżeli istniję dla nich. Oczywiście także nie twierdzę że tego też się nie da, tylko moja widza jest za uboga dlatego przychodzę z tym na forum dla początkujących.

A tak wogóle to mój problem nie dotyczył robienia zapytań, tylko samego czasu trwania while. Wykonałem kilka testów, które pokazły, że nie warto robić while w while, tylko lepiej wykonać jeden while, załadować jego wyniki do tablicy, i później na podstawie tej tablicy zrobić oddzielnego, niezależnego while-a. I twierdzę, że takie rozwiązanie trwa kilkanaście razy szybciej, cas na te dwa zapytania zmniejszył się z około 5sekund do jednej, no może do 2.


....kurcze jednak nie pomogło
...teraz trwa jescze dłużej sad.gif
...rzez help me
DeyV
Niestety - nie masz racji.

To, w jaki sposób są zagnieżdżane pętle, nie ma znaczenia na wydajność skryptu.
Ważna jest tylko ilość wykonanych w ten sposób iteracji.

Wiadomo jednak – im więcej zagłębień, tym szybciej (geometrycznie…) rośnie ich ilość, stąd ryzyko, że szybko się „przesadzi”.


Jeśli chcesz pomocy przy zapytaniu - podaj dokladnie, jakie informacje chcesz otrzymać, i zarys struktury bazy danych.

ps. skąd ta mania capslockowania w Twoich zapytaniach?
styx
no znowu muszę przyznąc że nie miałem racji, rzeczywiście rozbicie whilów nie dało żądanego efektu. Ale myślę że znajdę rozwiązanie za pomocą LEFT JOIN.
A duże litery w zapytaniach to tak po prostu, bo można wszystkie duże albo wszytkie małe, takie uogulnienie, jak np. na jednej bazie pracuje wiecej programistów i jeden coś robi w c# a inny w php i łączą się z ta bazą to jak są rożnej wielkości litery to też pojawiają się różne problemy.
.... ale no nie wiem dokońca tak się to jakoś wzieło smile.gif
... a pozatym duże jest piękne smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.