Rýchlosť fungovania aplikácie

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ricco24
Člen | 141
+
0
-

Chcem sa spýtať ktoré z nasledovných riešení je prijatelnejšie na výkon aplikácie.

Povedzme že tabuľka project má 1000 záznamov. Tabuľka project_institute ktorá drží záznami o jednotlivých inštitútoch podielajúcich sa na projekte (m x n tabuľka) má vyše 3000 záznamov.

Prvé riešenie
Využívanie len db dotazov.

public function getInstituteData($id) {
	//1 db dotaz
	$institute = $this->db->table('institute')->where('id', $id)->fetch();

	//počet dotazov na databázu - podľa počtu inštitútov
	foreach($institute->related('project_institute')->where('institute.id', $institute->id) as $project_institute) {
		$project[] = $this->getProjectData($project_institute->project->id);
	}
}
public function getProjectData($id) {
	//1 db dotaz
	$project = $this->db->table('project')->where('id', $id)->fetch();

	//počet dotazov na db - počet inštitútov x počet related záznamov ...
	foreach($project->related('institute_project') as $project_institute) {
		//ďalší kód
	}
}

Druhé riešenie
Využívanie polí na iteráciu.

public function getInstituteData($id) {
	$institute = $this->db->table('institute')->where('id', $id)->fetch();

	//vytiahnem si celé tabuľky do pola cez ktoré potom iterujem
	$this->projects = $this->makeArray($this->db->table('project'));
	$this->project_institutes = $this->makeArray($this->db->table('project_institute'));

	foreach($institute->related('project_institute')->where('institute.id', $institute->id) as $project_institute) {
		$project[] = $this->getProjectData($project_institute->project->id);
	}
}
public function getProjectData($id) {
	foreach($this->projects as $p) {
		if($p['id'] == $id) {
			$project = $p;
		}
	}

	foreach($this->project_institutes as $project_institute) {
		//ďalší kód
	}
}

Takže v prvom riešení sa vždy pri vyťahovaní projektu dotazujem na databázu čo určite nieje správne keďže tam tých projektov môže byť naozaj veľa. No v druhom riešení vyťahujem jedným dotazom tabuľku do premennej ktorú potom prevediem do poľa cez ktoré iterujem.

Ktoré riešienie je lepšie ? Poprípade ak sa vám nepozdáva ani jedno, ako by ste to riešili vy ?

Jan Endel
Člen | 1016
+
0
-

Výkonnost jednotlivých řešení silně závisí na typu použitého hardwaru, doporučuju na produkční mašině udělat nějaké benchmarky. Pro měření času zpracování se ideálně hodí tahle fičura.

Filip Procházka
Moderator | 4668
+
0
-

Tys ale nepochopil, že Nette\Database přesně tento problém řeší inteligentním pokládáním dotazů. Stačí správně napsat model.

use Nette\Database\Table\ActiveRow;

public function getInstituteData(ActiveRow $institute) {
        //počet dotazov na databázu - jeden
        foreach($institute->related('project_institute') as $project_institute) {
                $project[] = $this->getProjectData($project_institute->project);
        }
}

public function getProjectData(ActiveRow $project) {
        //počet dotazov na db - jeden
        foreach($project->related('institute_project') as $project_institute) {
                //ďalší kód
        }
}

A voláš

$institute = $db->table('institute')->get($id);
$model->getInstituteData($institute);

Stejně pak třeba

$project = $db->table('projects')->get($id);
$model->getProjectData($project);
ricco24
Člen | 141
+
0
-

Priznávam, v provom poste som zle napísal počty dotazov na db.
HosipLan tvoje riešenie pomocou predávania objektu je lepšie no nerieši môj problém.

Dajme tomu že related projektov k inštitúcii bude 500. To znamená že pri volaní

$institute = $db->table('institute')->get($id);
$model->getInstituteData($institute);

by sa vykonal 1 dotaz pri query related(‚project_institute‘) na inštitúciu no ďalších 500 dotazov na related(‚project_institute‘) pri projekte …

Editoval ricco24 (7. 4. 2012 15:07)